Minor GC、Major GC和Full GC之間的區(qū)別

堆內(nèi)存劃分為 Eden、Survivor 和 Tenured/Old 空間

Minor GC

從年輕代空間(包括 Eden 和 Survivor 區(qū)域)回收內(nèi)存被稱為 Minor GC。這一定義既清晰又易于理解。但是,當(dāng)發(fā)生Minor GC事件的時(shí)候,有一些有趣的地方需要注意到:

當(dāng) JVM 無(wú)法為一個(gè)新的對(duì)象分配空間時(shí)會(huì)觸發(fā) Minor GC,比如當(dāng) Eden 區(qū)滿了。所以分配率越高,越頻繁執(zhí)行 Minor GC。

內(nèi)存池被填滿的時(shí)候,其中的內(nèi)容全部會(huì)被復(fù)制,指針會(huì)從0開(kāi)始跟蹤空閑內(nèi)存。Eden 和 Survivor 區(qū)進(jìn)行了標(biāo)記和復(fù)制操作,取代了經(jīng)典的標(biāo)記、掃描、壓縮、清理操作。所以 Eden 和 Survivor 區(qū)不存在內(nèi)存碎片。寫(xiě)指針總是停留在所使用內(nèi)存池的頂部。

執(zhí)行 Minor GC 操作時(shí),不會(huì)影響到永久代。從永久代到年輕代的引用被當(dāng)成 GC roots,從年輕代到永久代的引用在標(biāo)記階段被直接忽略掉。

質(zhì)疑常規(guī)的認(rèn)知,所有的 Minor GC 都會(huì)觸發(fā)“全世界的暫停(stop-the-world)”,停止應(yīng)用程序的線程。對(duì)于大部分應(yīng)用程序,停頓導(dǎo)致的延遲都是可以忽略不計(jì)的。其中的真相就 是,大部分 Eden 區(qū)中的對(duì)象都能被認(rèn)為是垃圾,永遠(yuǎn)也不會(huì)被復(fù)制到 Survivor 區(qū)或者老年代空間。如果正好相反,Eden 區(qū)大部分新生對(duì)象不符合 GC 條件,Minor GC 執(zhí)行時(shí)暫停的時(shí)間將會(huì)長(zhǎng)很多。

所以 Minor GC 的情況就相當(dāng)清楚了——每次 Minor GC 會(huì)清理年輕代的內(nèi)存。

Major GC vs Full GC

大家應(yīng)該注意到,目前,這些術(shù)語(yǔ)無(wú)論是在 JVM 規(guī)范還是在垃圾收集研究論文中都沒(méi)有正式的定義。但是我們一看就知道這些在我們已經(jīng)知道的基礎(chǔ)之上做出的定義是正確的,Minor GC 清理年輕帶內(nèi)存應(yīng)該被設(shè)計(jì)得簡(jiǎn)單:

Major GC 是清理永久代。

Full GC 是清理整個(gè)堆空間—包括年輕代和永久代。

很不幸,實(shí)際上它還有點(diǎn)復(fù)雜且令人困惑。首先,許多 Major GC 是由 Minor GC 觸發(fā)的,所以很多情況下將這兩種 GC 分離是不太可能的。另一方面,許多現(xiàn)代垃圾收集機(jī)制會(huì)清理部分永久代空間,所以使用“cleaning”一詞只是部分正確。

這使得我們不用去關(guān)心到底是叫 Major GC 還是 Full GC,大家應(yīng)該關(guān)注當(dāng)前的 GC 是否停止了所有應(yīng)用程序的線程,還是能夠并發(fā)的處理而不用停掉應(yīng)用程序的線程。

這種混亂甚至內(nèi)置到 JVM 標(biāo)準(zhǔn)工具。下面一個(gè)例子很好的解釋了我的意思。讓我們比較兩個(gè)不同的工具 Concurrent Mark 和 Sweep collector (-XX:+UseConcMarkSweepGC)在 JVM 中運(yùn)行時(shí)輸出的跟蹤記錄。
我們從垃圾回收日志中所看到的那樣,實(shí)際上只是執(zhí)行了 Major GC 去清理老年代空間而已,而不是執(zhí)行了兩次 Full GC。

如果你是后期做決 定的話,那么由 jstat 提供的數(shù)據(jù)會(huì)引導(dǎo)你做出正確的決策。它正確列出的兩個(gè)暫停所有事件的情況,導(dǎo)致所有線程停止了共計(jì)50ms。但是如果你試圖優(yōu)化吞吐量,你會(huì)被誤導(dǎo)的。清 單只列出了回收初始標(biāo)記和最終 Remark 階段,jstat的輸出看不到那些并發(fā)完成的工作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容