【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )
文章目錄
- 總結
- 一、標記-清除算法
- 二、復制算法
- 三、標記-整理算法
總結
常用的垃圾回收算法 :
- 標記-清除算法 ;
- 復制算法 ;
- 標記-整理算法 ;
這些算法沒有好壞優劣之分 , 都有各自的 優勢 和 弊端 , 都有各自的 使用場景 ; 一般的垃圾回收 , 都是幾種垃圾回收算法結合起來一起使用 , 不同的場景下 , 使用不同的垃圾回收算法 ;
分代收集算法 : 該垃圾回收算法不是特定的回收算法 , 而是 合理地使用上述 333 個算法 , 在 不同的內存空間內 , 使用不同的垃圾收集器 ;
這里的分代 指的是 年輕代 , 老年代 ; 年輕代又分為 Eden 和 Survivor 兩個區域 , Survivor 又分為 From 和 To 兩個區域 ;
一、標記-清除算法
堆 內的內存區域如下 , 內存區域分為一個個內存塊 , 某個對象可能占用 222 個內存塊 , 也能占用若干個內存塊 ;
如果 定位 找到了 垃圾對象 , 那么 將該 垃圾對象 進行標記 , 如下圖 , 標記為 橙色 ;
標記好之后 , 在執行 GC 內存回收時 , 會 將 被標記的 內存 回收 ;
標記-清除算法優缺點 :
- 優點 : 算法 實現簡單;
- 缺點 : 產生了很多 不連續的內存 , 如果對象比較大 , 要用 555 個內存塊 , 會出現 OOM ;
二、復制算法
將 內存區域 , 分為兩部分 ;
對象只放在 左側區域 , 右側區域 空著 ;
左側區域 的 垃圾對象 回收后 , 將 存活 的對象 , 拷貝到 右側區域 中 ;
復制算法優缺點 :
- 優點 : 解決了 內存碎片 問題 ; 效率高 ;
- 缺點 : 只能使用 一半內存 ;
復制算法 適合使用 內存量較小 , 但是 操作很頻繁的區域 , 如 : 在 年輕代 的 Survivor 中 , 使用的就是 復制算法 垃圾回收機制 ;
三、標記-整理算法
標記-整理算法 是 標記-清除算法 的更完善的版本 , 標記-整理算法 解決了 內存碎片問題 ;
內存回收后 , 將內存中的對象重新 緊密地 排列 , 消除內存碎片 ;
標記-整理算法 優缺點 :
- 優點 : 消除了內存碎片 ;
- 缺點 : 性能較低 ; 執行該垃圾回收算法時 , 需要 對內存進行重排 , 此時不能隨意變動內存的數據結構 , 因此 執行該 標記-整理算法 時 , 整個線程需要整體停下來 , 但這樣大大影響程序的執行效率 ;
標記-整理 算法 , 不能用在 內存操作 活躍的場景中 , 如 : 老年代的垃圾回收 , 使用的是 標記-整理 算法 ;
總結
以上是生活随笔為你收集整理的【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java 虚拟机原理】Java 引用类
- 下一篇: 【Java 虚拟机原理】垃圾回收算法 (