天天看點

JVM垃圾回收算法圖解

JVM垃圾回收算法

紅色是标記的非活動對象,綠色是活動對象。

  • 标記-清除(Mark-Sweep)

    GC分為兩個階段,标記和清除。首先标記所有可回收的對象,在标記完成後統一回收所有被标記的對象。同時會産生不連續的記憶體碎片。碎片過多會導緻以後程式運作時需要配置設定較大對象時,無法找到足夠的連續記憶體,而不得已再次觸發GC。

    JVM垃圾回收算法圖解
  • 複制(Copy)

    将記憶體按容量劃分為兩塊,每次隻使用其中一塊。當這一塊記憶體用完了,就将存活的對象複制到另一塊上,然後再把已使用的記憶體空間一次清理掉。這樣使得每次都是對半個記憶體區回收,也不用考慮記憶體碎片問題,簡單高效。缺點需要兩倍的記憶體空間。

    JVM垃圾回收算法圖解
  • 标記-整理(Mark-Compact)

    也分為兩個階段,首先标記可回收的對象,再将存活的對象都向一端移動,然後清理掉邊界以外的記憶體。此方法避免标記-清除算法的碎片問題,同時也避免了複制算法的空間問題。

    一般年輕代中執行GC後,會有少量的對象存活,就會選用複制算法,隻要付出少量的存活對象複制成本就可以完成收集。而老年代中因為對象存活率高,沒有額外過多記憶體空間配置設定,就需要使用标記-清理或者标記-整理算法來進行回收。

    JVM垃圾回收算法圖解