新聞中心
full GC 和 Minor GC,傻傻分不清楚
作者:武培軒 2020-03-03 17:35:09
云計(jì)算
虛擬化 這篇文章主要來(lái)介紹下 JVM 中的各種 GC,讓大家來(lái)搞清楚這幾個(gè)概念。大家可能見(jiàn)到過(guò)很多的 GC 名詞,比如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。

這篇文章主要來(lái)介紹下 JVM 中的各種 GC,讓大家來(lái)搞清楚這幾個(gè)概念。
大家可能見(jiàn)到過(guò)很多的 GC 名詞,比如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。
這么多概念,想想都頭疼,到底各種亂七八糟的 GC 指的是什么?
下面先引用 R 大在知乎上的回答:
針對(duì) HotSpot VM 的實(shí)現(xiàn),它里面的 GC 其實(shí)準(zhǔn)確分類(lèi)有兩種:
Partial GC(局部 GC): 并不收集整個(gè) GC 堆的模式
- Young GC: 只收集 Young Gen 的 GC,Young GC 還有種說(shuō)法就叫做 Minor GC
- Old GC: 只收集 old gen 的 GC,只有垃圾收集器 CMS 的 concurrent collection 是這個(gè)模式
- Mixed GC: 收集整個(gè) Young Gen 以及部分 old gen 的 GC,只有垃圾收集器 G1 有這個(gè)模式
Full GC: 收集整個(gè)堆,包括新生代,老年代,永久代(在 JDK 1.8 及以后,永久代被移除,換為 metaspace 元空間)等所有部分的模式
接下來(lái)讓我們?cè)賮?lái)了解下各個(gè) GC:
(1)Minor GC / Young GC
首先我們先來(lái)看下 Minor GC / Young GC,大家都知道,新生代(Young Gen)也可以稱(chēng)之為年輕代,這兩個(gè)名詞是等價(jià)的。那么在年輕代中的 Eden 內(nèi)存區(qū)域被占滿之后,實(shí)際上就需要觸發(fā)年輕代的 GC,或者是新生代的 GC。
此時(shí)這個(gè)新生代 GC,其實(shí)就是所謂的 Minor GC,也可以稱(chēng)之為 Young GC,這兩個(gè)名詞,相信大家就理解了,說(shuō)白了,就專(zhuān)門(mén)針對(duì)新生代的 GC。
(2)Old GC
所謂的老年代 GC,稱(chēng)之為 Old GC 更加合適一些,因?yàn)閺淖置嬉饬x上就可以理解,這就是所謂的老年代 GC。
但是在這里之所以我們把老年代 GC 稱(chēng)之為Full GC,其實(shí)也是可以的,只不過(guò)是一個(gè)字面意思的多種不同的說(shuō)法。
為了更加精準(zhǔn)的表述這個(gè)老年代 GC 的含義,可以把老年代 GC 稱(chēng)之為 Old GC。
(3)Full GC
對(duì)于 Full GC,其實(shí)這里有一個(gè)更加合適的說(shuō)法,就是說(shuō) Full GC 指的是針對(duì)新生代、老年代、永久代的全體內(nèi)存空間的垃圾回收,所以稱(chēng)之為 Full GC。
從字面意思上也可以理解,F(xiàn)ull 就是整體的意思,所以就是對(duì) JVM 進(jìn)行一次整體的垃圾回收,把各個(gè)內(nèi)存區(qū)域的垃圾都回收掉。
(4)Major GC
還有一個(gè)名詞是所謂的 Major GC,這個(gè)其實(shí)一般用的比較少,他也是一個(gè)非常容易混淆的概念。
有些人把 Major GC 跟 Old GC等價(jià)起來(lái),認(rèn)為他就是針對(duì)老年代的 GC,也有人把 Major GC 和 Full GC 等價(jià)起來(lái),認(rèn)為他是針對(duì) JVM 全體內(nèi)存區(qū)域的GC。
所以針對(duì)這個(gè)容易混淆的概念,建議大家以后少提。如果聽(tīng)到有人說(shuō)這個(gè) Major GC的概念,大家可以問(wèn)清楚,他到底是想說(shuō) Old GC 呢?還是 Full GC 呢?
(5)Mixed GC
Mixed GC 是 G1 中特有的概念,其實(shí)說(shuō)白了,主要就是說(shuō)在 G1 中,一旦老年代占據(jù)堆內(nèi)存的 45%(-XX:InitiatingHeapOccupancyPercent:設(shè)置觸發(fā)標(biāo)記周期的 Java 堆占用率閾值,默認(rèn)值是 45%。這里的Java 堆占比指的是 non_young_capacity_bytes,包括 old + humongous),就要觸發(fā) Mixed GC,此時(shí)對(duì)年輕代和老年代都會(huì)進(jìn)行回收。Mixed GC 只有 G1 中才會(huì)出現(xiàn)。
參考
https://tech.meituan.com/2016/09/23/g1.html
https://www.zhihu.com/question/41922036/answer/93079526
《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐(第3版)》
當(dāng)前文章:FullGC和MinorGC,傻傻分不清楚
分享鏈接:http://www.5511xx.com/article/coipogj.html


咨詢(xún)
建站咨詢(xún)
