JVM垃圾回收器(Hotspot)
JVM垃圾回收器發(fā)展與對(duì)比
一,GC回收算法:
1,引用計(jì)數(shù)法
對(duì)象中使用計(jì)數(shù)器。此算法無法解決互相引用的場(chǎng)景。
2,可達(dá)性分析算法
從gcRoots集合出發(fā),查找引用鏈,如沒有鏈路鏈接的對(duì)象,則初次判斷為垃圾。
gcRoots集合一般包括兩類:全局的引用(如常量)、執(zhí)行上下文(棧幀中本地變量表)。
具體細(xì)節(jié):
2.1根節(jié)點(diǎn)枚舉階段:
不會(huì)把所有執(zhí)行上下文和全局的引用位置全部查出來,而是使用準(zhǔn)確式垃圾收集,是使用一組稱為OopMap的數(shù)據(jù)結(jié)構(gòu),一旦類加載動(dòng)作完成的時(shí)候,會(huì)把引用直接記錄在map集合中。收集器在掃描時(shí)可以直接得知map中信息了,并不需要真正一個(gè)不漏地從方法區(qū)等GC Roots開始查找。
2.2第一次判斷:
gcRoots的鏈路中沒有鏈接的對(duì)象,第一次標(biāo)記為垃圾。
2.3篩選:
件是此對(duì)象是否有必要執(zhí)行finalize()方法。假如對(duì)象沒有覆蓋finalize()方法,或者finalize()方法已經(jīng)被虛擬機(jī)調(diào)用過,那么虛擬機(jī)將這兩種情況都視為“沒有必要執(zhí)行”。
2.4第二次標(biāo)記:
如果為有必要執(zhí)行:將這些第一次標(biāo)記的垃圾對(duì)象放置在一個(gè)名為F-Queue的隊(duì)列中,由一條由虛擬機(jī)自動(dòng)建立的、低調(diào)度優(yōu)先級(jí)的線程執(zhí)行它們的finalize()方法。
收集器將對(duì)F-Queue中的對(duì)象進(jìn)行第二次小規(guī)模的標(biāo)記,如果此對(duì)象重新與引用鏈上的任何一個(gè)對(duì)象建立關(guān)聯(lián),則會(huì)被移出“即將回收”的集合。
2.5執(zhí)行:
finalize();
經(jīng)典垃圾回收器比較
衡量垃圾收集器的三項(xiàng)最重要的指標(biāo)是:內(nèi)存占用(Footprint)、吞吐量(Throughput)和延遲(Latency),三者共同構(gòu)成了一個(gè)“不可能三角”。三者總體的表現(xiàn)會(huì)隨技術(shù)進(jìn)步而越來越好,但是 要在這三個(gè)方面同時(shí)具有卓越表現(xiàn)的“完美”收集器是極其困難甚至是不可能的,一款優(yōu)秀的收集器通 常最多可以同時(shí)達(dá)成其中的兩項(xiàng)。
Hotspot垃圾回收器
1.Serial收集器
特點(diǎn),一條收集線程去完成垃圾收集工作,但是必須暫停其他所有工作線程,直到它收集結(jié)束??赡軙?huì)使用戶線程停止響應(yīng)。
優(yōu)點(diǎn):所有收集器里額外內(nèi)存消耗最少(沒有線程交互的開銷,專心做垃圾收集自然可以 獲得最高的單線程收集效率)
缺點(diǎn):暫停其他所有線程
1.1.Serial Old收集器
Serial收集器的老年代版本,同樣是一個(gè)單線程收集器,標(biāo)記-整理算法。
2.ParNew收集器
Serial收集器多線程版本,除了Serial收集器外,目前只有它能與CMS 收集器配合工作
優(yōu)點(diǎn):處理器核心數(shù)量的增加,ParNew對(duì)于垃圾收集時(shí) 系統(tǒng)資源更高效
3.Parallel Scavenge收集器(吞吐量?jī)?yōu)先收集器)
Parallel Scavenge收集器的目標(biāo)是達(dá)到一個(gè)可控制的吞吐 量(Throughput)。所謂吞吐量就是處理器用于運(yùn)行用戶代碼的時(shí)間與處理器總消耗時(shí)間的比值。
兩個(gè)參數(shù)用于精確控制吞吐量,分別是控制最大垃圾收集停頓時(shí)間 的-XX:MaxGCPauseMillis參數(shù)以及直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)。
3.1Parallel Old收集器
Parallel Scavenge收集器的老年代版本,支持多線程并發(fā)收集,基于標(biāo)記-整理算法實(shí)現(xiàn)。在注重 吞吐量或者處理器資源較為稀缺的場(chǎng)合,都可以優(yōu)先考慮Parallel Scavenge加Parallel Old收集器這個(gè)組合。
4.CMS(劃時(shí)代意義)
第一款真正意義上支持并發(fā)的垃圾收集器,它首次實(shí)現(xiàn)了讓垃圾收集線程與用戶線程(基本上)同時(shí)工作。關(guān)注點(diǎn)是以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。
過程分為四個(gè)步驟,包括:
1)初始標(biāo)記(CMS initial mark)
? 只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,速度很快。
2)并發(fā)標(biāo)記(CM S concurrent mark)
? 從GC Roots的直接關(guān)聯(lián)對(duì)象開始遍歷整個(gè)對(duì) 象圖的過程,這個(gè)過程耗時(shí)較長(zhǎng)但是不需要停頓用戶線程,可以與垃圾收集線程一起并發(fā)運(yùn)行。
3)重新標(biāo)記(CM S remark)
? 為了修正并發(fā)標(biāo)記期間,因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的 標(biāo)記記錄。
4)并發(fā)清除(CM S concurrent sweep)
? 清理刪除掉標(biāo)記階段判斷的已經(jīng)死亡的 對(duì)象,由于不需要移動(dòng)存活對(duì)象,所以這個(gè)階段也是可以與用戶線程同時(shí)并發(fā)的。
優(yōu)點(diǎn):并發(fā)收集、低停頓。
缺點(diǎn):1,占用了一部分線程(或者說處理器的計(jì) 算能力)而導(dǎo)致應(yīng)用程序變慢,降低總吞吐量
? 2,CMS收集器無法處理“浮動(dòng)垃圾”(FloatingGarbage),有可能出現(xiàn)“Con-current Mode Failure”失敗進(jìn)而導(dǎo)致另一次完全“Stop The World”的Full GC的產(chǎn)生。
? 3,空間碎片產(chǎn)生。無法找 到足夠大的連續(xù)空間來分配當(dāng)前對(duì)象,而不得不提前觸發(fā)一次Full GC。
?
5.G1(里程碑)
面向全堆的收集器,不 再需要其他新生代收集器的配合工作。目標(biāo)是在延遲可控的情況下獲得盡可能高的吞吐量。
G1收集器出現(xiàn)之前的所有 其他收集器,包括CMS在內(nèi),垃圾收集的目標(biāo)范圍要么是整個(gè)新生代(Minor GC),要么就是整個(gè)老 年代(M ajor GC),再要么就是整個(gè)Java堆(Full GC)。而G1跳出了這個(gè)樊籠,它可以面向堆內(nèi)存任 何部分來組成回收集(Collection Set,一般簡(jiǎn)稱CSet)進(jìn)行回收,衡量標(biāo)準(zhǔn)不再是它屬于哪個(gè)分代,而 是哪塊內(nèi)存中存放的垃圾數(shù)量最多,回收收益最大,這就是G1收集器的Mixed GC模式。
Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region),是一系列區(qū) 域(不需要連續(xù))的動(dòng)態(tài)集合,每一個(gè)Region都可以根據(jù)需要,扮演新生代的Eden空間、Survivor空間,或者老年代空間。收集器能夠?qū)Π缪莶煌巧?Region采用不同的策略去處理,這樣無論是新創(chuàng)建的對(duì)象還是已經(jīng)存活了一段時(shí)間、熬過多次收集的 舊對(duì)象都能獲取很好的收集效果。
G1收集器去跟蹤各個(gè)Region里面的垃 圾堆積的“價(jià)值”大小,價(jià)值即回收所獲得的空間大小以及回收所需時(shí)間的經(jīng)驗(yàn)值,然后在后臺(tái)維護(hù)一 個(gè)優(yōu)先級(jí)列表,每次根據(jù)用戶設(shè)定允許的收集停頓時(shí)間(使用參數(shù)-XX:M axGCPauseM illis指定,默 認(rèn)值是200毫秒),優(yōu)先處理回收價(jià)值收益最大的那些Region,這也就是“Garbage First”名字的由來。 這種使用Region劃分內(nèi)存空間,以及具有優(yōu)先級(jí)的區(qū)域回收方式,保證了G1收集器在有限的時(shí)間內(nèi)獲 取盡可能高的收集效率。
過程:
初始標(biāo)記(Initial M arking)
? 僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,并且修改TAM S 指針的值,讓下一階段用戶線程并發(fā)運(yùn)行時(shí),能正確地在可用的Region中分配新對(duì)象。這個(gè)階段需要 停頓線程,但耗時(shí)很短,而且是借用進(jìn)行Minor GC的時(shí)候同步完成的,所以G1收集器在這個(gè)階段實(shí)際 并沒有額外的停頓。
并發(fā)標(biāo)記(Concurrent Marking)
? 從GC Root開始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析,遞歸掃描整個(gè)堆 里的對(duì)象圖,找出要回收的對(duì)象,這階段耗時(shí)較長(zhǎng),但可與用戶程序并發(fā)執(zhí)行。當(dāng)對(duì)象圖掃描完成以 后,還要重新處理SAT B記錄下的在并發(fā)時(shí)有引用變動(dòng)的對(duì)象。
最終標(biāo)記(Final M arking)
? 對(duì)用戶線程做另一個(gè)短暫的暫停,用于處理并發(fā)階段結(jié)束后仍遺留 下來的最后那少量的SAT B記錄。
篩選回收(Live Data Counting and Evacuation)
? 負(fù)責(zé)更新Region的統(tǒng)計(jì)數(shù)據(jù),對(duì)各個(gè)Region的回 收價(jià)值和成本進(jìn)行排序,根據(jù)用戶所期望的停頓時(shí)間來制定回收計(jì)劃,可以自由選擇任意多個(gè)Region 構(gòu)成回收集,然后把決定回收的那一部分Region的存活對(duì)象復(fù)制到空的Region中,再清理掉整個(gè)舊 Region的全部空間。這里的操作涉及存活對(duì)象的移動(dòng),是必須暫停用戶線程,由多條收集器線程并行 完成的。
低延遲垃圾收集器
Shenandoah
Shenandoah的目標(biāo)是實(shí)現(xiàn)一種能在任何堆內(nèi)存大小下都可以把垃圾收集的停頓時(shí)間限制在十毫秒以內(nèi)的垃圾收集器,該目標(biāo)意味著相比CMS和G1,Shenandoah不僅要進(jìn)行并發(fā)的垃圾標(biāo)記,還要并發(fā)地進(jìn)行對(duì)象清理后的整理動(dòng)作。
Shenandoah反而更像是G1的繼承者,它們兩者有著相似的堆內(nèi)存布局,在初始標(biāo)記、并發(fā)標(biāo)記等許多階段的處理思路上都高度一致。
G1的回收階段是可以多線程并行的,但卻不能與用戶線程并發(fā)。Shenandoah通過轉(zhuǎn)發(fā)指針來解決這個(gè)問題。
Shenandoah三個(gè)最重要的并發(fā)階段(并發(fā)標(biāo)記、并發(fā)回收、并發(fā)引用更新)。
未完待續(xù)。。
ZGC
總結(jié)
以上是生活随笔為你收集整理的JVM垃圾回收器(Hotspot)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 唐骏:改变性格
- 下一篇: BlackBerry的simulator