1. 程式人生 > >JVM--18 【垃圾回收演算法】標記-整理演算法和分代收集演算法

JVM--18 【垃圾回收演算法】標記-整理演算法和分代收集演算法

         前言: 複製收集演算法在物件存活率較高時就要進行大量的複製操作,效率將會變低。更關鍵的是,如果不想浪費50%的空間,就需要額外的空間進行分配擔保,以應對被使用的記憶體中所有物件都100%存活的極端情況,所以在老年代一般不能直接選用複製演算法。

 標記-整理演算法

         根據老年代的特點,有人提出了另外一種“標記-整理”演算法,其實這裡的標記-整理就是在標記-清除演算法中加了一步:整理。即就是“標記-整理-清除”演算法。前邊都是一樣,先標記處可達物件(存活物件),但是後續步驟不是直接對可回收物件進行清除,而是讓所有存活的物件向一端移動,然後直接清除掉端邊界以外的記憶體。

        缺點:較“標記-清除”演算法而言,多了一步移動(整理)的過程,效率低。


            分代收集演算法

             當前商業的虛擬機器的垃圾收集都採用“分代收集”演算法,這種演算法並沒有什麼新思想。只是根據物件存活週期的不同將記憶體劃分為幾塊。一般都是把Java堆分為新生代和老年代。

             新生代,每次垃圾收集時都發現大批物件死去,物件存活率低。選用複製演算法。

             老年代,物件存活率高,沒有額外的記憶體空間對它進行分配擔保,就必須選用“標記-清除”或“標記-整理”演算法進行回收。