溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java垃圾回收器的定義及算法

發(fā)布時(shí)間:2021-08-24 21:22:17 來源:億速云 閱讀:189 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“Java垃圾回收器的定義及算法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java垃圾回收器的定義及算法”吧!

1、Java垃圾回收器的定義

Java垃圾回收器是Java虛擬機(jī)(JVM)的三個(gè)重要模塊(另外兩個(gè)是解釋器和多線程機(jī)制)之一,為應(yīng)用程序提供內(nèi)存的自動(dòng)分配(Memory Allocation)、自動(dòng)回收(Garbage Collect)功能,這兩個(gè)操作都發(fā)生在Java堆上(一段內(nèi)存快)。某一個(gè)時(shí)點(diǎn),一個(gè)對(duì)象如果有一個(gè)以上的引用(Rreference)指向它,那么該對(duì)象就為活著的(Live),否則死亡(Dead),視為垃圾,可被垃圾回收器回收再利用。垃圾回收操作需要消耗CPU、線程、時(shí)間等資源,所以容易理解的是垃圾回收操作不是實(shí)時(shí)的發(fā)生(對(duì)象死亡馬上釋放),當(dāng)內(nèi)存消耗完或者是達(dá)到某一個(gè)指標(biāo)(Threshold,使用內(nèi)存占總內(nèi)存的比列,比如0.75)時(shí),觸發(fā)垃圾回收操作。有一個(gè)對(duì)象死亡的例外,java.lang.Thread類型的對(duì)象即使沒有引用,只要線程還在運(yùn)行,就不會(huì)被回收。

2、Java垃圾回收器的性能評(píng)估工具

–XX:+PrintGCDetails和–XX:+PrintGCTimeStamps

垃圾回收的開始時(shí)間,持續(xù)時(shí)間,每一代的空余內(nèi)存等信息。

jmap [options] pid

jamp 2043 查看2043進(jìn)程里面已經(jīng)加載的共享對(duì)象。通常DLL文件。

jmap -heap 2043 查看內(nèi)存堆的配置信息以及使用情況。

jmap -permstat 2043 查看永久代的加載情況。

jmap -histo 2043 查看類的加載和內(nèi)存占用情況。

jstat [options] pid

jstat -class 2043 class加載、卸載、內(nèi)存占用情況。

jstat -gc 2043 GC執(zhí)行情況。

3、垃圾回收算法

(1)標(biāo)記清除算法

標(biāo)記清除算法分成兩步,第一步,標(biāo)記要回收的垃圾對(duì)象,第二步就是清除被標(biāo)記的垃圾對(duì)象. 標(biāo)記清除算法會(huì)產(chǎn)生大量的內(nèi)存碎片,而且效率低.所以,為了解決這個(gè)問題,出現(xiàn)了復(fù)制清除算法.

(2)復(fù)制清除算法(專門用于處理年輕代垃圾的)

所謂復(fù)制清除算法,就是在要進(jìn)行垃圾回收的時(shí)候,先將活著的對(duì)象整齊的復(fù)制到一塊空閑區(qū)域,然后再將原來的區(qū)域的垃圾全部清除. 復(fù)制清除算法的優(yōu)點(diǎn):效率高于標(biāo)記清除算法,活著的對(duì)象是整齊排列的,沒有內(nèi)存碎片. 但是這個(gè)方法的缺點(diǎn)也很明顯,那就是浪費(fèi)空間.

(3)標(biāo)記清理算法(年老代)

將活著的對(duì)象一個(gè)接一個(gè)的按順序排好,然后再清除變成垃圾的對(duì)象.這種方法不會(huì)造成碎片,也不會(huì)造成內(nèi)存的浪費(fèi).但是效率不高.所以,這種方法不適合在年輕代使用,而是在對(duì)象生命力很頑強(qiáng)的年老代使用

(4)分類算法

所謂分類算法,就是根據(jù)內(nèi)存的不同,采用不同的垃圾回收方式(上面的1,2,3)進(jìn)行垃圾回收.

4、典型的垃圾收集器
  

(1)Serial/Serial Old
  

Serial/Serial Old收集器是最基本最古老的收集器,它是一個(gè)單線程收集器,并且在它進(jìn)行垃圾收集時(shí),必須暫停所有用戶線程。Serial收集器是針對(duì)新生代的收集器,采用的是Copying算法,Serial Old收集器是針對(duì)老年代的收集器,采用的是Mark-Compact算法。它的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單高效,但是缺點(diǎn)是會(huì)給用戶帶來停頓。

(2)ParNew
  

ParNew收集器是Serial收集器的多線程版本,使用多個(gè)線程進(jìn)行垃圾收集。

(3)Parallel Scavenge
  

Parallel Scavenge收集器是一個(gè)新生代的多線程收集器(并行收集器),它在回收期間不需要暫停其他用戶線程,其采用的是Copying算法,該收集器與前兩個(gè)收集器有所不同,它主要是為了達(dá)到一個(gè)可控的吞吐量。

(4)Parallel Old
  

Parallel Old是Parallel Scavenge收集器的老年代版本(并行收集器),使用多線程和Mark-Compact算法。

(5)CMS
  

CMS(Current Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,它是一種并發(fā)收集器,采用的是Mark-Sweep算法。

(6)G1
  

G1收集器是當(dāng)今收集器技術(shù)發(fā)展最前沿的成果,它是一款面向服務(wù)端應(yīng)用的收集器,它能充分利用多CPU、多核環(huán)境。因此它是一款并行與并發(fā)收集器,并且它能建立可預(yù)測的停頓時(shí)間模型。

到此,相信大家對(duì)“Java垃圾回收器的定義及算法”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI