垃圾回收器學習之Full GC和CMS GC的區別

針對HotSpot VM的實現,它里面的GC其實準確分類只有兩大種:Partial GC:并不收集整個GC堆的模式
Young GC:只收集young gen的GC
Old GC:只收集old gen的GC。只有CMS的concurrent collection是這個模式。
Mixed GC:收集整個young gen以及部分old gen的GC。只有G1有這個模式。

HotSpot VM里其它非并發GC的觸發條件復雜一些,不過大致的原理與上面說的其實一樣。當然也總有例外。Parallel Scavenge(-XX:+UseParallelGC)框架下,默認是在要觸發full GC前先執行一次young GC,并且兩次GC之間能讓應用程序稍微運行一小下,以期降低full GC的暫停時間(因為young GC會盡量清理了young gen的死對象,減少了full GC的工作量)。并發GC的觸發條件就不太一樣。以CMS GC為例,它主要是定時去檢查old gen的使用量,當使用量超過了觸發比例就會啟動一次CMS GC,對old gen做并發收集。并發并行垃圾回收器在觸發full gc之前都會先觸發一下young垃圾回收,這個可以根據參數進行配置。而串行垃圾回收的full gc默認就是老年代回收。

  1. Full GC == Major GC指的是對老年代/永久代的stop the world的GC

  2. Full GC的次數 = 老年代GC時 stop the world的次數

  3. Full GC的時間 = 老年代GC時 stop the world的總時間

  4. CMS 不等于Full GC,我們可以看到CMS分為多個階段,只有stop the world的階段被計算到了Full GC的次數和時間,而和業務線程并發的GC的次數和時間則不被認為是Full GC。CMS主要可以分為initial mark(stop the world), concurrent mark, remark(stop the world), concurrent sweep幾個階段,其中initial mark和remark會stop the world。

  5. Full GC本身不會先進行Minor GC,我們可以配置,讓Full GC之前先進行一次Minor GC,因為老年代很多對象都會引用到新生代的對象,先進行一次Minor GC可以提高老年代GC的速度。比如老年代使用CMS時,設置CMSScavengeBeforeRemark優化,讓CMS remark之前先進行一次Minor GC。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 作者:一字馬胡 轉載標志 【2017-11-12】 更新日志 日期更新內容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,232評論 0 7
  • 垃圾回收算法具體實現 翻譯原文 => plumbr Java GC handbook 前文參見: Java垃圾回收...
    foxracle閱讀 2,871評論 0 15
  • 原文閱讀 前言 這段時間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊,這博客我...
    碼農戲碼閱讀 6,018評論 2 31
  • System.gc整理 System.gc()源碼public static void gc() { Runtim...
    andersonoy閱讀 2,976評論 0 1
  • 姓名:顧君 單位:寧波大發化纖有限公司 學習組:第234期努力一組 【日精進打卡第44天】 【知~學習】 《六項精...
    JASONGU_2f28閱讀 372評論 0 0