1、标記清除算法(MarkSweep)
執行步驟:
- 标記:周遊整個記憶體區域,對需要回收的對象打上标記。
- 清除:再次周遊記憶體,對标記過的記憶體進行回收。
圖解:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHL90zZM9kMZVzTPFmNqVHT1QWd3UTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5IWMxIWZmhTMmlTYmRDZ4gjM3QzYlVGN4YGN0cjY1kzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
缺點:
- 效率問題:周遊了兩次記憶體空間(第一次标記,第二次清除)。
- 空間問題:容易産生大量記憶體碎片,當再需要一塊比較大的記憶體時,雖然總的可用記憶體是夠的,但是由于太過分散,無法找到一塊連續的且滿足配置設定要求的,因而不得不再次觸發一次GC。
2、複制算法(Copying)
将記憶體劃分為等大的兩塊,每次隻使用其中的一塊。
當一塊用完了,觸發GC時,将該塊中存活的對象複制到另一塊區域,然後一次性清理掉這塊沒有用的記憶體。
下次觸發GC時将那塊中存活的的又複制到這塊,然後抹掉那塊,循環往複。
圖解:
優點:
相對于标記–清理算法解決了記憶體的碎片化問題,這種算法沒有記憶體碎片。
因為複制的時候,會把存活的對象,聚攏在一起。效率更高(清理記憶體時,記住首尾位址,一次性抹掉)。
缺點:
浪費記憶體,記憶體使用率不高,每次隻能使用一半記憶體。8G的記憶體,隻能使用4G,這個是無法接受的。
3、标記整理算法
當對象的存活率比較高時,或者對象比較大時,用前面的複制算法這樣複制過來,複制過去,沒啥意義,且浪費時間。
執行步驟:
标記:對需要回收的進行标記
整理:讓存活的對象,向記憶體的一端移動,然後直接清理掉沒有用的記憶體。
圖解:
缺點:複雜度更高
3個算法各有利弊,各自有各自的适用場景