天天看點

JVM垃圾回收算法1、标記清除算法(MarkSweep)2、複制算法(Copying)3、标記整理算法

1、标記清除算法(MarkSweep)

執行步驟:

  • 标記:周遊整個記憶體區域,對需要回收的對象打上标記。
  • 清除:再次周遊記憶體,對标記過的記憶體進行回收。

圖解:

JVM垃圾回收算法1、标記清除算法(MarkSweep)2、複制算法(Copying)3、标記整理算法
JVM垃圾回收算法1、标記清除算法(MarkSweep)2、複制算法(Copying)3、标記整理算法

缺點:

  • 效率問題:周遊了兩次記憶體空間(第一次标記,第二次清除)。
  • 空間問題:容易産生大量記憶體碎片,當再需要一塊比較大的記憶體時,雖然總的可用記憶體是夠的,但是由于太過分散,無法找到一塊連續的且滿足配置設定要求的,因而不得不再次觸發一次GC。

2、複制算法(Copying)

将記憶體劃分為等大的兩塊,每次隻使用其中的一塊。

當一塊用完了,觸發GC時,将該塊中存活的對象複制到另一塊區域,然後一次性清理掉這塊沒有用的記憶體。

下次觸發GC時将那塊中存活的的又複制到這塊,然後抹掉那塊,循環往複。

圖解:

JVM垃圾回收算法1、标記清除算法(MarkSweep)2、複制算法(Copying)3、标記整理算法
JVM垃圾回收算法1、标記清除算法(MarkSweep)2、複制算法(Copying)3、标記整理算法

優點:

相對于标記–清理算法解決了記憶體的碎片化問題,這種算法沒有記憶體碎片。

因為複制的時候,會把存活的對象,聚攏在一起。效率更高(清理記憶體時,記住首尾位址,一次性抹掉)。

缺點:

浪費記憶體,記憶體使用率不高,每次隻能使用一半記憶體。8G的記憶體,隻能使用4G,這個是無法接受的。

3、标記整理算法

當對象的存活率比較高時,或者對象比較大時,用前面的複制算法這樣複制過來,複制過去,沒啥意義,且浪費時間。

執行步驟:

标記:對需要回收的進行标記

整理:讓存活的對象,向記憶體的一端移動,然後直接清理掉沒有用的記憶體。

圖解:

JVM垃圾回收算法1、标記清除算法(MarkSweep)2、複制算法(Copying)3、标記整理算法
JVM垃圾回收算法1、标記清除算法(MarkSweep)2、複制算法(Copying)3、标記整理算法

缺點:複雜度更高

3個算法各有利弊,各自有各自的适用場景