jvm垃圾收集器

默認垃圾收集器

jdk9之前:serial? +? serial old

jdk9及之后:G1

Serial

HotSpot新生代默認回收器

1.只能單線程回收? 標記-復制算法

2.再回收時需要“Stop the world”

3.回收效率高,所有線程都停下來知道垃圾回收回收完

ParNew

是Serial的并行版本

1.標記-復制

2.多條回收線程并行,但是回收線程和用戶線程不能并行

3.需要“stop the world”

Parallel Scavenge

1.標記 - 復制

2.多線程并行 需要“stop the world”

3.吞吐量優(yōu)先,可以通過配置設(shè)置吞吐量大小

吞吐量 = 運行用戶代碼時間/(運行用戶代碼 + 垃圾回收時間)

新生代設(shè)置相對大一些,吞吐量相對會大一些,因為垃圾回收不是那么頻繁

處理器資源稀缺,想優(yōu)先處理用戶代碼 就可以把吞吐量設(shè)置大一些

4.可以設(shè)置停頓時間大?。ㄟ@里是指停頓時間,后邊的cms、G1控制收集時間因為不需要stop the

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? world)

? 可以設(shè)置吞吐量大小,

5.可以通過參數(shù)設(shè)置,開啟自適應策略 收集器會根據(jù)運行情況自動調(diào)整新生代老年代大小等參數(shù)

Serial Old

1.標記 - 整理

2.單線程回收 回收的時候不會出現(xiàn)新的垃圾

3.老年代

Parallel Old

1.標記 - 整理

2.多線程并行,同時并發(fā)

3.老年代的回收器

CMS

1.標記-清除

2.并發(fā)以獲取最短停頓時間為目標?

3.步驟:

初始標記

并發(fā)標記

重新標記? 處理用戶線程并行期間產(chǎn)生變化的數(shù)據(jù)

并發(fā)清除

4.缺點: 并發(fā)操作更消耗cpu資源影響用戶線程,浮動垃圾

5.優(yōu)化:

缺點一可以忽略

缺點二設(shè)置閾值當堆占用68%或90%時就觸發(fā)垃圾回收 并發(fā)失敗就stop the world full GC

其他 處理內(nèi)存碎片,設(shè)置參數(shù)在Full GC之前先進行碎片整理

G1

算法:標記-復制

思想:部分回收讓停頓時間可控

特點:1.不分新生代老年代,將整個堆分若干個region

? ? ? ? ? 2.每次回收的時候是將存活的對象復制到空的region中,原來的region清空

? ? ? ? ? 3.有Region 中有一類Hummongous區(qū)域用來存儲大對象(對象超過了region的一半)

? ? 4.可以設(shè)置單次回收所允許的最長時間,G1會根據(jù)是時間評估具體需要回收哪些region,這個時間一般為一百至三百毫秒

? ? 5.執(zhí)行步驟:

? ? ? 初始標記

? ? ? 并發(fā)標記:只有這個階段是并發(fā)的

? ? ? 重新標記:處理用戶線程并行期間發(fā)生變化的數(shù)據(jù) SATB

? ? ? 篩選收集:標記-復制

只有并發(fā)標記階段是并發(fā)的其他的都需要stop the worldZGC可以在篩選收集階段實現(xiàn)并發(fā)

新生代的一般是標記-復制,老年代的一般是標記-整理cms標記清除 G1標記復制

G1相對CMS的優(yōu)點和弱點

1.G1的優(yōu)秀特點

? ? 1)G1可以設(shè)置最大停頓時間? cms不可以

? ? 2)G1是region的內(nèi)存布局? cms分新生代老年代

? ? 3)G1是按受益來動態(tài)確定收集行為

? ? 4)G1采用標記-復制算法,沒有內(nèi)存碎片

2.弱點

? ? 1)內(nèi)存占用高:

? ? ? ? ? G1為了解決region問題,每個region上都有一個卡表,所以G1的記憶集會占用超過堆20%的內(nèi)存空間,cms也使用了卡表來處理跨代指針,但是只有新生代老年代所以占用內(nèi)存較小

? ? ? 2)負載高:

? ? ? ? ? cms需要使用寫后屏障維護卡表

? ? ? ? ? G1需要使用寫后屏障維護卡表,還需要使用寫前屏障記錄指針(G1用了原始快照搜索算法所以需要這個指針)

各個回收器之間的關(guān)系:

新生代:? serial? --并行-->? parNew? --吞吐量-->? parallel scavenge?

老年代:? serial old? ? ? ? ? ? cms? ? ? ? ? ? ? ? ? ? ? ? ? ? parallel old

綜合: G1

經(jīng)典組合: ps + po

? ? ? ? ? ? ? ? parnew + cms + serial old

? ? ? ? ? ? ? ? G1

如何選擇垃圾收集器?

影響選擇的因素:

1.關(guān)注點(吞吐量、延遲、內(nèi)存占用)

2.基礎(chǔ)設(shè)施(處理器數(shù)量、內(nèi)存大小、操作系統(tǒng)是window還是Linux)

3.JDK的發(fā)行商、版本號

幾種收集器的特點

C1:綜合性能好 花錢

ZGC:使用比較新的軟硬件版本,注重延遲

Shenandoah:window

CMS:堆內(nèi)存在4G到6G,硬件和JDK比較落后

G1:堆內(nèi)存更大一點考慮G1

注重吞吐量: ps + po

注重低延遲,對停頓時間敏感:

? ? ? ? ? ? ? ? ? ? 內(nèi)存?。?cms

? ? ? ? ? ? ? ? ? ? 內(nèi)存夠大:G1 ZGC

整個內(nèi)存回收過程是什么樣的流程?

1.大對象直接進入老年代? 可設(shè)置界限

2.多次回收仍存活的進入老年代

分代年齡判定

新生代每回收一次年齡加一,超過15進入老年代

動態(tài)年齡判定

相同年齡的對象占用survivor一半內(nèi)存,那么等于或大于這個年齡的對象直接進入老年代

3.內(nèi)存擔保

? 新生代回收時(復制算法 survivor到另一個survivor)不夠用,就直接將無法容納的對象放入老年代,如果老年代也放不下就Full GC

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

友情鏈接更多精彩內(nèi)容