Full GC 和 Minor GC,傻傻分不清楚

這篇文章主要來介紹下 JVM 中的各類 GC,讓你們來搞清楚這幾個概念。html

你們可能見到過不少的 GC 名詞,好比:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。spa

這麼多概念,想一想都頭疼,到底各類亂七八糟的 GC 指的是什麼?htm

下面先引用 R 大在知乎上的回答:內存

針對 HotSpot VM 的實現,它裏面的 GC 其實準確分類有兩種:ci

  • 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:get

(1)Minor GC / Young GC虛擬機

首先咱們先來看下 Minor GC / Young GC,你們都知道,新生代(Young Gen)也能夠稱之爲年輕代,這兩個名詞是等價的。那麼在年輕代中的 Eden 內存區域被佔滿以後,實際上就須要觸發年輕代的 GC,或者是新生代的 GC。it

此時這個新生代 GC,其實就是所謂的 Minor GC,也能夠稱之爲 Young GC,這兩個名詞,相信你們就理解了,說白了,就專門針對新生代的 GC。io

(2)Old GC垃圾回收

所謂的老年代 GC,稱之爲 Old GC 更加合適一些,由於從字面意義上就能夠理解,這就是所謂的老年代 GC。

可是在這裏之因此咱們把老年代 GC 稱之爲Full GC,其實也是能夠的,只不過是一個字面意思的多種不一樣的說法。

爲了更加精準的表述這個老年代 GC 的含義,能夠把老年代 GC 稱之爲 Old GC。

(3)Full GC

對於 Full GC,其實這裏有一個更加合適的說法,就是說 Full GC 指的是針對新生代、老年代、永久代的全體內存空間的垃圾回收,因此稱之爲 Full GC。

從字面意思上也能夠理解,Full 就是總體的意思,因此就是對 JVM 進行一次總體的垃圾回收,把各個內存區域的垃圾都回收掉。

(4)Major GC

還有一個名詞是所謂的 Major GC,這個其實通常用的比較少,他也是一個很是容易混淆的概念。

有些人把 Major GC 跟 Old GC等價起來,認爲他就是針對老年代的 GC,也有人把 Major GC 和 Full GC 等價起來,認爲他是針對 JVM 全體內存區域的GC。

因此針對這個容易混淆的概念,建議你們之後少提。若是聽到有人說這個 Major GC的概念,你們能夠問清楚,他究竟是想說 Old GC 呢?仍是 Full GC 呢?

(5)Mixed GC

Mixed GC 是 G1 中特有的概念,其實說白了,主要就是說在 G1 中,一旦老年代佔據堆內存的 45%(-XX:InitiatingHeapOccupancyPercent:設置觸發標記週期的 Java 堆佔用率閾值,默認值是 45%。這裏的Java 堆佔比指的是 non_young_capacity_bytes,包括 old + humongous),就要觸發 Mixed GC,此時對年輕代和老年代都會進行回收。Mixed GC 只有 G1 中才會出現。

參考

https://tech.meituan.com/2016/09/23/g1.html

https://www.zhihu.com/question/41922036/answer/93079526

《深刻理解Java虛擬機:JVM高級特性與最佳實踐(第3版)》

相關文章
相關標籤/搜索