JVM常見問題(2)
阿新 • • 發佈:2021-10-10
GC的演算法有哪些?怎麼用
GC演算法主要有四種:
1、引用計數法(一般不用)
每個物件都有一個引用計數器,當該物件被引用一次,則計數器+1,若物件引用失效一次,則計數器-1,當計數器為0時,則說明該物件為垃圾物件。
優點:
- 簡單
- 計算代價分散
- 物件從死亡到回收的時間短
缺點:
- 不擅長處理迴圈引用的物件
- 併發支援較弱
- 佔用記憶體
2、複製演算法
通過將記憶體平均分成兩個部分,每次只使用其中一個部分,當這部分的記憶體滿時,將記憶體中所有存活的物件複製到另一部分記憶體中,然後清空之前的記憶體,只使用當前的記憶體,以此交替進行。最典型的例子就是新生區的輕GC機制。
優點:
- 簡單
- 不產生記憶體碎片
缺點:
- 浪費記憶體空間
3、標記清除演算法
給每個物件標記,表示該物件的狀態(是否需要清除)。整個過程分為兩個階段,第一個階段是標記階段,這個階段會為每個物件更新標記,確認物件是否死亡,第二個階段是清除階段,對那些死亡的物件進行清除。
優點:
- 不需要移動物件
- 相較於引用計數,只需要檢測標記即可
缺點:
- 效率低,需要遍歷全部物件,標記階段需遍歷活的物件,清除階段需遍歷所有物件
- 從物件死亡到回收的時間長
- 碎片空間無法利用
4、標記壓縮演算法
該演算法是在標記清除演算法的基礎上進行改進,在清除階段,將所有存活物件進行移動,移至一個區域,將其餘物件清除
優點:
- 不會產生大量碎片空間,且gc後有連續的空記憶體空間
缺點:
-
需要移動成本
-
記憶體效率:複製演算法 > 標記清除演算法 > 標記壓縮演算法
-
記憶體整齊度:複製演算法 = 標記壓縮演算法 > 標記清除演算法
-
記憶體利用率:標記壓縮演算法 = 標記清除演算法 > 複製演算法