hotspot垃圾回收器概覽

知識點
- 只要涉及到對象地址移動的就必須STW,所以young gc一定SWT
垃圾回收算法
- 標記-清除: 內(nèi)存碎片化
- 標記-整理: 需要移動對象
- 復(fù)制算法: 適合對象存活率不高的場景
- 分代收集
新生代回收器,簡單, 高效(單CPU)
-
serial:單線程的收集器image.png
-
parNew: 其實就是Serial收集器的多線程版本
image.png Parallel Scavenge:比parNew多的功能是支持可控制的吞吐量(Throughput)
老年代回收器
Serial Old:單線程和“標記-整理”算法
Parallel Old:多線程和“標記-整理”算法
CMS
標記—清除算法
- 初始標記(CMS initial mark):僅僅只是標記一下GC Roots能直接關(guān)聯(lián)到的對象,速度很快
- 并發(fā)標記(CMS concurrent mark)
- 重新標記(CMS remark)
- 并發(fā)清除(CMS concurrent sweep)
1.標記需要SWT
2.用時最長的并發(fā)標記和并發(fā)清除可以與用戶線程同時進行
3.內(nèi)存碎片導(dǎo)致無法分配大對象時會整理內(nèi)存,STW時長會變成
G1
根據(jù)允許的收集時間,優(yōu)先回收價值最大的Region(這也就是Garbage-First名稱的來由)

1.并行與并發(fā):G1能充分利用多CPU、多核環(huán)境下的硬件優(yōu)勢,使用多個CPU(CPU或者CPU核心)來縮短Stop-The-World停頓的時間,部分其他收集器原本需要停頓Java線程執(zhí)行的GC動作,G1收集器仍然可以通過并發(fā)的方式讓Java程序繼續(xù)執(zhí)行。
2.分代收集:與其他收集器一樣,分代概念在G1中依然得以保留。雖然G1可以不需要其他收集器配合就能獨立管理整個GC堆,但它能夠采用不同的方式去處理新創(chuàng)建的對象和已經(jīng)存活了一段時間、熬過多次GC的舊對象以獲取更好的收集效果。
3.空間整合:與CMS的“標記—清理”算法不同,G1從整體來看是基于“標記—整理”算法實現(xiàn)的收集器,從局部(兩個Region之間)上來看是基于“復(fù)制”算法實現(xiàn)的,但無論如何,這兩種算法都意味著G1運作期間不會產(chǎn)生內(nèi)存空間碎片,收集后能提供規(guī)整的可用內(nèi)存。這種特性有利于程序長時間運行,分配大對象時不會因為無法找到連續(xù)內(nèi)存空間而提前觸發(fā)下一次GC。
4.可預(yù)測的停頓:這是G1相對于CMS的另一大優(yōu)勢,降低停頓時間是G1和CMS共同的關(guān)注點,但G1除了追求低停頓外,還能建立可預(yù)測的停頓時間模型,能讓使用者明確指定在一個長度為M毫秒的時間片段內(nèi),消耗在垃圾收集上的時間不得超過N毫秒,這幾乎已經(jīng)是實時Java(RTSJ)的垃圾收集器的特征了。
G1官方文檔:https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

