1. 程式人生 > 其它 >JVM常見問題(2)

JVM常見問題(2)

GC的演算法有哪些?怎麼用

GC演算法主要有四種:

1、引用計數法(一般不用)

​ 每個物件都有一個引用計數器,當該物件被引用一次,則計數器+1,若物件引用失效一次,則計數器-1,當計數器為0時,則說明該物件為垃圾物件。

優點:

  • 簡單
  • 計算代價分散
  • 物件從死亡到回收的時間短

缺點:

  • 不擅長處理迴圈引用的物件
  • 併發支援較弱
  • 佔用記憶體

2、複製演算法

​ 通過將記憶體平均分成兩個部分,每次只使用其中一個部分,當這部分的記憶體滿時,將記憶體中所有存活的物件複製到另一部分記憶體中,然後清空之前的記憶體,只使用當前的記憶體,以此交替進行。最典型的例子就是新生區的輕GC機制。

優點:

  • 簡單
  • 不產生記憶體碎片

缺點:

  • 浪費記憶體空間

3、標記清除演算法

​ 給每個物件標記,表示該物件的狀態(是否需要清除)。整個過程分為兩個階段,第一個階段是標記階段,這個階段會為每個物件更新標記,確認物件是否死亡,第二個階段是清除階段,對那些死亡的物件進行清除。

優點:

  • 不需要移動物件
  • 相較於引用計數,只需要檢測標記即可

缺點:

  • 效率低,需要遍歷全部物件,標記階段需遍歷活的物件,清除階段需遍歷所有物件
  • 從物件死亡到回收的時間長
  • 碎片空間無法利用

4、標記壓縮演算法

​ 該演算法是在標記清除演算法的基礎上進行改進,在清除階段,將所有存活物件進行移動,移至一個區域,將其餘物件清除

優點:

  • 不會產生大量碎片空間,且gc後有連續的空記憶體空間

缺點:

  • 需要移動成本

  • 記憶體效率:複製演算法 > 標記清除演算法 > 標記壓縮演算法

  • 記憶體整齊度:複製演算法 = 標記壓縮演算法 > 標記清除演算法

  • 記憶體利用率:標記壓縮演算法 = 標記清除演算法 > 複製演算法