jvm垃圾回收(gc)算法、收集器比較總結

判斷對象是否可回收(是否存活)

1、引用計數法:

記錄引用次數,不被引用減一,缺點,無法解決循環嵌套引用(hotspot不適用)

gc信息的打印 -verbose:gc (打印簡單) -XX:+PrintGCDetails(打印詳細)

2、可達性分析法

根據 GcRoot 是否可以達到對應對象來判斷。可以解決嵌套問題

GcRoots :虛擬機棧,方法區類屬性(靜態)引用對象,方法區常量引用對象。本地方法棧

 

清除算法

1、標記-清除法

1.1 效率較低,標記清除執行效率不高

1.2 空間問題,空間不規整,大數據無法存儲

2、複製算法-針對新生代

2.1 內存空間分佈爲兩部分,使用標記清除後,將存活內容移動到另一個區域整合。然後在新的區域寫入,再整合。問題是浪費內存

2.2 hotspot 分年代算法

新生代:eden,survivor1,survivor2

老年代: tenured Gen

2.3

1.eden 放入新對象,判斷存活放入survivor(eden不足會觸發垃圾回收)

2.清理無用,放入另一個survivor。

3.再次存入,清理eden和survivor,然後放入另一個survivor

(一般分配,eden 80%,survivor 10%*2,當survivor不足放入老年代)

 

3、標記整理算法-老年代

將內存局域分割兩部分,每次進行標記,標記之後再進行移動,一遍清理,一遍不清理,比標記清理算法性能高

 

4、分代算法

將內存分代,新生代和老年代分別採用複製算法和標記整理算法不同的算法

 

垃圾收集器(垃圾回收時代碼暫停)

1、serial收集器(複製算法)並行-新生代

最基本,發展最悠久的。單線程的收集。回收效率低。但是適用於桌面應用等佔用內存小的。單線程效果好

2、parnnew(複製算法)並行-新生代

多線程收集器,將單線程回收變爲多線程併發收集(複用了大部分serial代碼)

關注點在於減少收集時間

優點 cms 回收老年代,只能配合serial和parnnew 無法配合 parallel

3、parallel(複製算法)並行-新生代

和parnnew類似,多線程收集器

區別關注點不同:

parallel關注點在於 控制吞吐量(cpu執行用戶代碼時間與cpu總耗時比值)總耗時位 代碼時間+垃圾回收時間

兩個參數控制,1、垃圾回收的最大時間(-XX:MAXGCPauseMillis) 2、指定吞吐量(0-100之間)-XX:GCTimeRatio

parnnew 關注點在於 降低每次垃圾回收的時間

4、cms Concurrent Mark Sweep(標記清除算法,一般針對老年代)

併發收集:

1、初始標記(對GCRoots直接關聯對象進行標記)

2、根據初始標記進行併發標記

3、對併發標記中產生的垃圾進行並行標記

4、併發清理標記垃圾

優點:

1、併發收集

2、低停頓(但是吞吐量不高,併發吞吐量低於並行)

缺點:

1、cpu佔用高(所有多線程缺點)

2、產生浮動垃圾,執行第4步驟時候產生的垃圾

3、空間碎片(算法缺陷)

4、Concurrent Mode Failure (要在內存區域中制定一塊在併發標記和清理過程使用,過大浪費過小就會出現這個異常,當出現這個異常時就會採用serial-old版本(單線程並行,標記整理算法),更加浪費時間)

5、G1(標記整理算法)新生代+老年代

收集:收集流程和cms類似(除了初始標記以外,都可以使用併發或者並行),最終爲篩選回收

優點:

1、並行與併發

2、分代收集

(將內存區域分爲很多region,存在rememberSet表對 region分類排序(E S O H 其中h用來借貸給其他region存儲巨型對象,可以使用多個合併),對收集效率更高的模塊進行收集)

在寫入過程中,會有一個寫入中斷進行判斷,是否和引用是同一個region,如果不是同一個,就會把引用記錄rememberSet中,也會將rememberSet作爲GCRoots進行可達性分析(進其他分代算法中,如果兩個不同代引用,單獨代回收沒法回收,只能通過full Gc進行收集)

3、空間整合(算法優勢)

4、可預測停頓(可以指定在一個長度m毫秒時間,垃圾收集時間不超過n毫秒)

與cms相比較,優勢可預測(減少)停頓,單說吞吐量並不比cms高多少,適用於很大的應用,動則幾百G的內存佔用,分佈式的建構回收使用cms足夠了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章