Java面試知識點(五十三)垃圾回收算法

標記-清除算法 Mark-Sweep

這是一個非常基本的GC算法,它是現代GC算法的思想基礎,分爲標記和清除兩個階段:先把所有活動的對象標記出來,然後把沒有被標記的對象統一清除掉。但是它有兩個問題,一是效率問題,兩個過程的效率都不高。二是空間問題,清除之後會產生大量不連續的內存。

在這裏插入圖片描述

複製算法 Copying (新生代)

複製算法是將原有的內存空間分成兩塊,每次只使用其中的一塊。在GC時,將正在使用的內存塊中的存活對象複製到未使用的那一塊中,然後清除正在使用的內存塊中的所有對象,並交換兩塊內存的角色,完成一次垃圾回收。它比標記-清除算法要高效,但不適用於存活對象較多的內存,因爲複製的時候會有較多的時間消耗。它的致命缺點是會有一半的內存浪費。

在這裏插入圖片描述

標記整理算法 Mark-Compact(老年代)

標記整理算法適用於存活對象較多的場合,它的標記階段和標記-清除算法中的一樣。整理階段是將所有存活的對象壓縮到內存的一端,之後清理邊界外所有的空間。它的效率也不高。

在這裏插入圖片描述

區別

(1)效率:複製算法>標記/整理算法>標記/清除算法(此處的效率只是簡單的對比時間複雜度,實際情況不一定如此)。

(2)內存整齊度:複製算法=標記/整理算法>標記/清除算法。

(3)內存利用率:標記/整理算法=標記/清除算法>複製算法。


分代收集算法:(新生代的GC+老年代的GC)

  • 少量對象存活,適合複製算法:在新生代中,每次GC時都發現有大批對象死去,只有少量存活,那就選用複製算法,只需要付出少量存活對象的複製成本就可以完成GC。
  • 大量對象存活,適合用標記-清理/標記-整理:在老年代中,因爲對象存活率高、沒有額外空間對他進行分配擔保,就必須使用“標記-清理”/“標記-整理”算法進行GC。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章