GC算法-分代垃圾回收

概述

分代垃圾回收並不是一個新的算法, 而是將之前的回收算法結合利用, 分場景使用.

簡單來說, 分代垃圾回收的思路, 就是給每個對象都分配一個年齡, 年齡越大的, 活的越久, 被回收的概率就越小. 經驗表明, 大部分對象在生成後馬上就成了垃圾.

也就是說, 年輕人要多運動, 沒事的時候多看看, 常回收. 老年人好靜, 一般不去驚擾他老人家.

分代垃圾回收就是利用這個現象, 將堆分爲了新生代老年代, 新生代的對象大部分會馬上變成垃圾, 而新生代經歷過幾次回收後, 對象就會晉升到老年代中. 老年代中的對象不會經常回收. 然後, 就可以針對不同分代, 利用針對性的GC算法.

實現

還記得之前的標記複製算法麼? 將堆進行二等分. 在分代回收中, 也將堆進行分塊, 分爲新生代堆以及老年代堆.

針對新生代: 利用複製算法, 避免了內存碎片化, 同時分配內存更快速(因爲新生代就是會頻繁的申請內存). 同時將年齡大的對象加到老年代中.

當然, 在針對新生代複製中, 因爲要通過根集合遍歷所有活動對象, 也就是要對所有對象進行遍歷, 爲了減少遍歷次數, 通過維護一個集合(保存所有老年代中引用了新生代對象的指針), 這樣就能減少對象的遍歷.

針對老年代: 直接使用標記清除即可.

分析

通過對不同的對象有針對性的執行算法, 結合了不同算法的優點. 使得其吞吐量得到改善.對回收頻繁的內存, 使用複製算法 速度快、內存分配也高效.

但是, 如果有的程序並並不符合年紀輕輕就死掉的規則, 一個程序的大部分對象都能夠活很久, 那就適得其反了.

當然也不只有新生老年兩代, 也可以有多代.


針對分代垃圾回收就簡單說一下, 因爲JVM用的就是它, 網上一找一大把, 簡直太多了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章