這篇文章主要來介紹下 JVM 中的各種 GC昔园,讓大家來搞清楚這幾個概念。
大家可能見到過很多的 GC 名詞并炮,比如:Minor GC默刚、Young GC、Full GC逃魄、Old GC荤西、Major GC、Mixed GC伍俘。
這么多概念邪锌,想想都頭疼,到底各種亂七八糟的 GC 指的是什么癌瘾?
下面先引用 R 大在知乎上的回答:
針對 HotSpot VM 的實現(xiàn)觅丰,它里面的 GC 其實準確分類有兩種:
- Partial GC(局部 GC): 并不收集整個 GC 堆的模式
- Young GC: 只收集 Young Gen 的 GC,Young GC 還有種說法就叫做 Minor GC
- Old GC: 只收集 old gen 的 GC柳弄,只有垃圾收集器 CMS 的 concurrent collection 是這個模式
- Mixed GC: 收集整個 Young Gen 以及部分 old gen 的 GC舶胀,只有垃圾收集器 G1 有這個模式
- Full GC: 收集整個堆,包括新生代碧注,老年代,永久代(在 JDK 1.8 及以后糖赔,永久代被移除萍丐,換為 metaspace 元空間)等所有部分的模式
接下來讓我們再來了解下各個 GC:
(1)Minor GC / Young GC
首先我們先來看下 Minor GC / Young GC,大家都知道放典,新生代(Young Gen)也可以稱之為年輕代逝变,這兩個名詞是等價的。那么在年輕代中的 Eden 內(nèi)存區(qū)域被占滿之后奋构,實際上就需要觸發(fā)年輕代的 GC壳影,或者是新生代的 GC。
此時這個新生代 GC弥臼,其實就是所謂的 Minor GC宴咧,也可以稱之為 Young GC,這兩個名詞径缅,相信大家就理解了掺栅,說白了烙肺,就專門針對新生代的 GC。
(2)Old GC
所謂的老年代 GC氧卧,稱之為 Old GC 更加合適一些桃笙,因為從字面意義上就可以理解,這就是所謂的老年代 GC沙绝。
但是在這里之所以我們把老年代 GC 稱之為Full GC搏明,其實也是可以的,只不過是一個字面意思的多種不同的說法闪檬。
為了更加精準的表述這個老年代 GC 的含義星著,可以把老年代 GC 稱之為 Old GC。
(3)Full GC
對于 Full GC谬以,其實這里有一個更加合適的說法强饮,就是說 Full GC 指的是針對新生代、老年代为黎、永久代的全體內(nèi)存空間的垃圾回收邮丰,所以稱之為 Full GC。
從字面意思上也可以理解铭乾,F(xiàn)ull 就是整體的意思剪廉,所以就是對 JVM 進行一次整體的垃圾回收,把各個內(nèi)存區(qū)域的垃圾都回收掉炕檩。
(4)Major GC
還有一個名詞是所謂的 Major GC斗蒋,這個其實一般用的比較少,他也是一個非常容易混淆的概念笛质。
有些人把 Major GC 跟 Old GC等價起來泉沾,認為他就是針對老年代的 GC,也有人把 Major GC 和 Full GC 等價起來妇押,認為他是針對 JVM 全體內(nèi)存區(qū)域的GC跷究。
所以針對這個容易混淆的概念,建議大家以后少提敲霍。如果聽到有人說這個 Major GC的概念俊马,大家可以問清楚,他到底是想說 Old GC 呢肩杈?還是 Full GC 呢柴我?
(5)Mixed GC
Mixed GC 是 G1 中特有的概念,其實說白了扩然,主要就是說在 G1 中艘儒,一旦老年代占據(jù)堆內(nèi)存的 45%(-XX:InitiatingHeapOccupancyPercent:設(shè)置觸發(fā)標記周期的 Java 堆占用率閾值,默認值是 45%。這里的Java 堆占比指的是 non_young_capacity_bytes彤悔,包括 old + humongous)嘉抓,就要觸發(fā) Mixed GC,此時對年輕代和老年代都會進行回收晕窑。Mixed GC 只有 G1 中才會出現(xiàn)抑片。
參考
https://tech.meituan.com/2016/09/23/g1.html
https://www.zhihu.com/question/41922036/answer/93079526
《深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版)》