1. 程式人生 > >Jvm垃圾回收器(演算法篇)

Jvm垃圾回收器(演算法篇)

  在《Jvm垃圾回收器(基礎篇)》中我們主要學習了判斷物件是否存活還是死亡?兩種基礎的垃圾回收演算法:引用計數法、可達性分析演算法。以及Java引用的4種分類:強引用、軟引用、弱引用、虛引用。和方法區的回收介紹。

那麼接下來我們重點研究下虛擬機器的幾種常見的垃圾回收演算法:標記-清除演算法、複製演算法、標記-整理演算法、分代收集演算法。

一:標記-清除演算法

  最基礎的收集演算法,總共分為‘ 標記 ’和‘ 清除 ’兩個階段

1.標記

  標記出所有需要回收的物件

  在《Jvm垃圾回收器(基礎篇)》中說明了判斷物件是否回收需要兩次標記,現在我們再來回顧一下

  一次標記:在經過可達性分析演算法

後,物件沒有與GC Root相關的引用鏈,那麼則被第一次標記。並且進行一次篩選:當物件有必要執行finalize()方法時,則把該物件放入F-Queue佇列中。

  二次標記:對F-Queue佇列中的物件進行二次標記。在執行finalize()方法時,如果物件重新與GC Root引用鏈上的任意物件建立了關聯,則把他移除出“ 即將回收 ”集合。否則就等著被回收吧!!!

  對被第一次標記切被第二次標記的,就可以判定位可回收物件了。

2.清除

  兩次標記後,還在“ 即將回收 ”集合的物件進行回收。

  執行過程如下:

  優點:基礎最基礎的可達性演算法,後續的收集演算法都是基於這種思想實現的

  缺點

:標記和清除效率不高,產生大量不連續的記憶體碎片,導致建立大物件時找不到連續的空間,不得不提前觸發另一次的垃圾回收。

二:複製演算法

  將可用記憶體按容量分為大小相等的兩塊,每次只使用其中一塊,當這一塊的記憶體用完了,就將還存活的物件複製到另外一塊記憶體上,然後再把已使用過的記憶體空間一次清理掉。

  複製演算法執行過程如下:

  優點:實現簡單,效率高。解決了標記-清除演算法導致的記憶體碎片問題。

  缺點:代價太大,將記憶體縮小了一半。效率隨物件的存活率升高而降低。

 現在的商業虛擬機器都採用這種演算法(需要改良1:1的缺點)來回收新生代。

2.1 HotSpot虛擬機器的改良演算法 

1.弱代理論 

  分代垃圾收集基於弱代理論。具體描述如下:

  • 大多說分配了記憶體的物件並不會存活太長時間,在處於年輕時代就會死掉。
  • 很少有物件會從老年代變成年輕代。

   其中IBM研究表明:新生代中98%的物件都是"朝生夕死"; 所以並不需要按1:1比例來劃分記憶體(解決了缺點1);

 2.Hotspot虛擬機器新生代記憶體佈局及演算法

  新生代記憶體分配一塊較大的Eden空間和兩塊較小的Survivor空間

  每次使用Eden和其中一塊Survivor空間

  回收時將Eden和Survivor空間中存活的物件一次性複製到另一塊Survivor空間上

  最後清理掉Eden和使用過的Survivor空間。

Hotspot虛擬機器預設Eden和Survivor的大小比例是8:1。

分配擔保

  如果另一塊Survivor空間沒有足夠記憶體來存放上一次新生代收集下來的存活物件,那麼這些物件則直接通過擔保機制進入老年代。

關於分配擔保的內容,我會在講述垃圾收集器時詳細描述。

三:標記-整理演算法

  標記-整理演算法是根據老年代的特點應運而生。

3.1 標記

  標記過程和標記-清理演算法一致(也是基於可達性分析演算法)。

3.2 整理

  和標記-清理不同的是,該演算法不是針對可回收物件進行清理,而是根據存活物件進行整理。讓存活物件都向一端移動,然後直接清理掉邊界以外的記憶體。

標記-整理演算法示意圖

  優點:不會像複製演算法那樣隨著存活物件的升高而降低效率,不像標記-清除演算法那樣產生不連續的記憶體碎片

  缺點:效率問題,除了像標記-清除演算法的標記過程外,還多了一步整理過程,效率更低。

四:分代收集演算法

  當前商業虛擬機器的垃圾收集都是採用“ 分代收集 ”演算法。

根據物件存活週期的不同將記憶體劃分為幾塊。一般把java堆分為新生代和老年代。JVM根據各個年代的特點採用不同的收集演算法。

新生代中,每次進行垃圾回收都會發現大量物件死去,只有少量存活,因此比較適合複製演算法。只需要付出少量存活物件的複製成本就可以完成收集。

老年代中,因為物件存活率較高,沒有額外的空間進行分配擔保,所以適合標記-清理、標記-整理演算法來進行回收。

----對《深入理解Java虛擬機器》第3章垃圾收集器與記憶體分配策略 3.3小節總結。接下來總結3.5垃圾收集器。

參考:

《深入理解Java虛擬機器》

https://blog.csdn.net/tjiyu/article/details/53983064