JVM在進行GC時,并非每次都對上面三個內(nèi)存(新生代豹芯、老年代;方法區(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 會清理年輕代的內(nèi)存鲜锚。)
- 因為Java對象
大多都具備朝生夕滅
的特性,所以Minor GC非常頻繁,一般回收速度也比較快。這已定義即清晰又易于理解苫拍。 - Minor GC會引發(fā)STW,暫停其它用戶的線程,等垃圾回收結束,用戶線程才恢復運行芜繁。
老年代GC(Major GC/Full GC)觸發(fā)機制:
- 指發(fā)生在老年代的GC,對象從老年代消失時,我們說"Major GC"或"Full GC"發(fā)生了。
- 出現(xiàn)了Major GC,經(jīng)常會伴隨至少一次的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) 調(diào)用System.gc()時,系統(tǒng)建議執(zhí)行Full GC,但是不必然執(zhí)行
(2) 老年代空間不足
(3) 方法區(qū)空間不足
(4) 通過Minor GC后進入老年代的平均大小大于老年代的可用內(nèi)存
(5) 由Eden區(qū)、survivor space0(From Space)區(qū)向survivor space1(To Space)區(qū)復制時,對象大小大于To Space可用內(nèi)存,則把該對象轉(zhuǎn)存到老年代,且老年代的可用內(nèi)存小于該對象大小
說明: full gc是開發(fā)或條有種盡量要避免的,這樣暫時時間會短一些抠刺。