針對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默認就是老年代回收。
Full GC == Major GC指的是對老年代/永久代的stop the world的GC
Full GC的次數 = 老年代GC時 stop the world的次數
Full GC的時間 = 老年代GC時 stop the world的總時間
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。
Full GC本身不會先進行Minor GC,我們可以配置,讓Full GC之前先進行一次Minor GC,因為老年代很多對象都會引用到新生代的對象,先進行一次Minor GC可以提高老年代GC的速度。比如老年代使用CMS時,設置CMSScavengeBeforeRemark優化,讓CMS remark之前先進行一次Minor GC。