GC垃圾回收之標記清除、複製、標記整理和分代回收算法詳解

GC進行垃圾回收,首先通過引用計數法和根搜索法判斷對象是否存活,再通過標記清除、或者複製、標記整理以及分代回收算法進行垃圾回收,本篇博客將對該4種算法進行詳細講解。

1)標記清除
其實很好理解,就是標記哪些是垃圾,然後執行清除就把空間清理出來了,這就是標記清除算法。

假設上圖中的小中大三種方塊對應1M、2M和4M,清除標記的垃圾以後,就會產生很多段內存空間(內存碎片),而實際開闢內存空間時,需要的是連續的內存區域。比如需要一個2M的內存區域,但是隻剩2個1M的內存區域,這樣的區域是沒法用的,所以該算法的缺點就是,容易產生內存碎片。

2)複製
爲了解決標記清除算法產生內存碎片的缺陷而被提出來的算法。每次需要分配內存時,先按內存容量將內存劃分爲等大小的兩塊,該段時間內只允許在其中一塊內存上進行分配,比如說A塊,當A塊內存被分配完後,則把A塊內存上尚存活的對象複製到B塊內存上,然後直接清理A塊內存。

該算法雖然解決了內存碎片的問題,但是又帶來一個新問題:可用內存被壓縮到了原本的一半,且存活對象增多的話,複製算法的效率會大大降低。

3)標記整理
爲了解決標記清除算法和複製算法的缺陷而提出來的,思想也很簡單,就是標記後先不清理,而是將這些存活對象移向內存的一端,然後從端邊界開始清除,也就是中間多了一個整理的步驟。

標記整理算法雖然解決了標記清除算法和複製算法所帶來的缺陷,但是從圖上就可以看出來,標記整理算法內存變動變得更加頻繁,因爲需要不斷整理存活對象的引用地址),所以在效率上比複製算法要差很多。

4)分代回收
分代回收嚴格來說不算一種思想或理論,它是融合上述3種算法思想,而產生的針對不同情況所採用不同算法的一套組合拳,也是目前大部分Jvm默認採用的算法,其核心思想是根據對象存活的不同生命週期將內存劃分爲不同的域(老年代和新生代)。
老年代的特點是每次垃圾回收時只有少量對象需要被回收
新生代的特點是每次垃圾回收時都有大量垃圾需要被回收
所以分代回收算法可以根據不同區域選擇不同的算法
 

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