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