天天看點

【004】【JVM——垃圾收集算法】

Java虛拟機學習總結檔案夾

垃圾收集算法

垃圾收集算法的實作涉及大量的程式細節,并且各個平台的虛拟機操作記憶體的方法又各不同樣,介紹幾種垃圾收集算法的思想及其發展過程.

垃圾收集分為“标記”和“清除”兩個階段:首先标記全部須要回收的對象。在标記完畢後統一回收全部被标記的對象。說它是最基礎的收集算法。其它收集算法都是基于這樣的思路并對其不足進行改進而得到的.它的主要不足有兩個:

效率問題,标記和消除兩個過程的效率都不高:

空間問題,标記清除之後會産生大量不連續的記憶體碎片,空間碎片太多可能會導緻以後在程式執行過程中須要配置設定較大對象時。無法找到足夠的連續記憶體而不得不提前觸發還有一次垃圾收集動作。

算法運作步驟例如以下圖所看到的

【004】【JVM——垃圾收集算法】

将可用記憶體按容量劃分為大小相等的兩塊,每次僅僅使用當中的一塊。

當這一塊的記憶體用完了,就将還存活着的對象拷貝到另外一塊上面,然後再把已使用過的記憶體空間一次清理掉。實作簡單,執行高效。

【004】【JVM——垃圾收集算法】

首先标記全部須要回收的對象,然後讓全部存活的對象都向一端移動,然後直接清理掉端邊界以外的記憶體。

【004】【JVM——垃圾收集算法】

商業虛拟機的垃圾收集都採用“分代收集”( Generational Collection )算法。依據對象存活周期的不同将記憶體劃分為幾塊。通常是把Java堆分為新生代初老年代,這樣就能夠依據各個年代的特點採用最适當的收集算法。在新生代中,每次垃圾收集時都發現有大批對象死去,僅僅有少量存活,選用複制算法。僅僅須要付出少量存活對象的複制成本就能夠完畢收集。而老年代中由于對象存活率高、沒有額外空間對它進行配置設定擔保。就必須使用“标記一清理”或者“标記一整理”算法來進行回收。

【004】【JVM——垃圾收集算法】

【參見】【深入了解Java虛拟機(第二版)】【周志明】

繼續閱讀