文章目錄
- 總結
- 一、標記-清除演算法
- 二、復制演算法
- 三、標記-整理演算法
總結
常用的垃圾回收演算法 :
- 標記-清除演算法 ;
- 復制演算法 ;
- 標記-整理演算法 ;
這些演算法沒有好壞優劣之分 , 都有各自的 優勢 和 弊端 , 都有各自的 使用場景 ; 一般的垃圾回收 , 都是幾種垃圾回收演算法結合起來一起使用 , 不同的場景下 , 使用不同的垃圾回收演算法 ;
分代收集演算法 : 該垃圾回收演算法不是特定的回收演算法 , 而是 合理地使用上述 3 3 3 個演算法 , 在 不同的記憶體空間內 , 使用不同的垃圾收集器 ;
這里的分代 指的是 年輕代 , 老年代 ; 年輕代又分為 Eden 和 Survivor 兩個區域 , Survivor 又分為 From 和 To 兩個區域 ;
一、標記-清除演算法
堆 內的記憶體區域如下 , 記憶體區域分為一個個記憶體塊 , 某個物件可能占用 2 2 2 個記憶體塊 , 也能占用若干個記憶體塊 ;
如果 定位 找到了 垃圾物件 , 那么 將該 垃圾物件 進行標記 , 如下圖 , 標記為 橙色 ;
標記好之后 , 在執行 GC 記憶體回收時 , 會 將 被標記的 記憶體 回收 ;

標記-清除演算法優缺點 :
- 優點 : 演算法 實作簡單;
- 缺點 : 產生了很多 不連續的記憶體 , 如果物件比較大 , 要用 5 5 5 個記憶體塊 , 會出現 OOM ;
二、復制演算法
將 記憶體區域 , 分為兩部分 ;
物件只放在 左側區域 , 右側區域 空著 ;
左側區域 的 垃圾物件 回收后 , 將 存活 的物件 , 拷貝到 右側區域 中 ;

復制演算法優缺點 :
- 優點 : 解決了 記憶體碎片 問題 ; 效率高 ;
- 缺點 : 只能使用 一半記憶體 ;
復制演算法 適合使用 記憶體量較小 , 但是 操作很頻繁的區域 , 如 : 在 年輕代 的 Survivor 中 , 使用的就是 復制演算法 垃圾回識訓制 ;
三、標記-整理演算法
標記-整理演算法 是 標記-清除演算法 的更完善的版本 , 標記-整理演算法 解決了 記憶體碎片問題 ;
記憶體回收后 , 將記憶體中的物件重新 緊密地 排列 , 消除記憶體碎片 ;

標記-整理演算法 優缺點 :
- 優點 : 消除了記憶體碎片 ;
- 缺點 : 性能較低 ; 執行該垃圾回收演算法時 , 需要 對記憶體進行重排 , 此時不能隨意變動記憶體的資料結構 , 因此 執行該 標記-整理演算法 時 , 整個執行緒需要整體停下來 , 但這樣大大影響程式的執行效率 ;
標記-整理 演算法 , 不能用在 記憶體操作 活躍的場景中 , 如 : 老年代的垃圾回收 , 使用的是 標記-整理 演算法 ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297566.html
標籤:java
