1. 程式人生 > >JVM常見的垃圾回收算法

JVM常見的垃圾回收算法

使用 內存空間 碎片 標記清除 http 可用內存 就是 運行 年輕

          JVM常見的垃圾回收算法

  1、標記-清除算法

    標記清除算法也是最基礎的算法,就如同他的名字一樣,標記清除算法的步驟分為兩個步驟,首先標記出需要回收的所有對象,然後在完成標記之後統一清除掉所有被標記的對象,之所以說它是最基礎的算法,是因為後續算法都是基於此算法,改進其缺點衍生出來的,標記清除算法有兩個缺點,標記和清除這兩個步驟都會有性能損耗,且效率低,其次是在完成對象的清除後會留下不連續的內存碎片,算法如下圖:

技術分享圖片

2、復制算法

為了提高效率,我們又引入了復制算法,將現有可用的內存大小均分為二,每次只使用其中一半,當這半內存已滿,就將未消亡的對象copy到另一半去,然後再把使用過的內存清除掉,往復如此,每次分配內存我們只需要按照順分配,就不需要考慮產生內存碎片,高效運行,但也有一個缺點,就是每次可以使用的內存減半,算法如下圖:

技術分享圖片

3、標記-整理算法

我們發現,在對象存活率較高的時候(老年代的特點),每次復制都包含了對大量存活對象的copy,這個時候就會大大降低復制算法的效率,除此之外,我們也不想可用內存減半,這時候我們就需要引入標記整理算法,標記整理算法也分為兩個步驟,第一步標記和標記清理算法一致,標記需要回收的對象,不過第二步不是直接回收,而是將村會的對象向可用內存空間某一端移動,而清除掉端邊界以外的內存。算法如圖:

技術分享圖片

4、分代收集算法

    目前商用虛擬機所使用的收集算法,將內存分為多個模塊,把新生的對象存儲在新生代(也叫年輕代),將新生代多次gc依舊存活的對象移動到老年代中。

    新生代:存儲新創建的對象,gc時往往伴隨著大量的需要回收的對象,所以新生代采用復制算法,只需將少量存活對象copy,就可以完成對象回收。

    老年代:當新生代創建的對象經歷多次gc依舊存活之後,就會將他移動到老年代,所以在對老年代的對象進行回收時,往往伴隨著大量存活的對象,這時候就可以選擇 標記清除算法標記整理算法。

      持久代:存放靜態文件,java類、方法等,對垃圾回收並無太大影響

JVM常見的垃圾回收算法