Minor GC、Major GC與Full GC

JVM在進行GC時,并非每次都對上面三個內存(新生代、老年代;方法區(qū))區(qū)域一起回收的,大部分時候回收的都是指新生代。
針對HotSpot VM的實現(xiàn),它里面的GC按照回收區(qū)域又分為兩大種類型:一種是部分收集(Partial GC),一種是整堆收集(Full GC)

  • 部分收集: 不是完整收集整個Java堆的垃圾收集。其中又分為:
    • 新生代收集(Minor GC/Young GC): 只是新生代的垃圾收集
    • 老年代收集(Major GC/Old GC): 只是老年代的垃圾收集。
      • 目前,只有CMS GC會有單獨收集老年代的行為。
      • 注意,很多時候Major GC會和Full GC混淆使用,需要具體分辨是老年代回收還是整堆回收。
    • 混合收集(Mixed GC): 收集整個新生代以及部分老年代的垃圾收集。
      • 目前,只有G1 GC會有這種行為。
  • 整堆收集(Full GC): 收集整個java堆和方法區(qū)的垃圾收集。

年輕代GC(Minor GC)觸發(fā)機制:

  • 當年輕代空間不足時,就會觸發(fā)Minor GC,這里的年輕代滿指的是Eden區(qū)滿,Survivor滿不會引發(fā)GC。(每次Minor GC 會清理年輕代的內存。)
  • 因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。這已定義即清晰又易于理解。
  • Minor GC會引發(fā)STW,暫停其它用戶的線程,等垃圾回收結束,用戶線程才恢復運行。

老年代GC(Major GC/Full GC)觸發(fā)機制:

  • 指發(fā)生在老年代的GC,對象從老年代消失時,我們說"Major GC"或"Full GC"發(fā)生了。
  • 出現(xiàn)了Major GC,經常會伴隨至少一次的Minor GC(但非絕對的,在Parallel Scavenge收集器的收集策略里就有直接進行Major GC的策略選擇過程)。
    • 也就是在老年代空間不足時,會先嘗試觸發(fā)Minor GC。如果之后空間還不足,則觸發(fā)Major GC。
  • Major GC的速度一般會比Minor GC慢10倍以上,STW的時間更長。

Full GC觸發(fā)機制:

觸發(fā)Full GC執(zhí)行的情況如下五種:
(1) 調用System.gc()時,系統(tǒng)建議執(zhí)行Full GC,但是不必然執(zhí)行
(2) 老年代空間不足
(3) 方法區(qū)空間不足
(4) 通過Minor GC后進入老年代的平均大小大于老年代的可用內存
(5) 由Eden區(qū)、survivor space0(From Space)區(qū)向survivor space1(To Space)區(qū)復制時,對象大小大于To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小于該對象大小
說明: full gc是開發(fā)或條有種盡量要避免的,這樣暫時時間會短一些。

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

友情鏈接更多精彩內容