jvm 垃圾回收:新生代都是複製算法,老年代都是標記整理算法

1、爲什麼新生代都是複製算法

因爲新生代對象生存時間比較短,80%都是要回收的對象,採用標記-清除算法則內存空間碎片化嚴重,採用複製算法可以靈活高效,且便與整理空間。

2、老年代都是標記整理算法

標記整理算法解決來標記-清除算法的內存碎片化的問題,又解決了複製算法的兩個Survivor區的問題,因爲老年代的空間比較大,不可能採用複製算法,特別佔用內存空間,

3、爲什麼要設置兩個Survivor區

首先看下複製算法:Survivor區,一塊叫From,一塊叫To,對象存在Eden和From塊。當進行GC時,Eden存活的對象全移到To塊,而From中,存活的對象按年齡值確定去向,當達到一定值(年齡閾值,通過-XX:MaxTenuringThreshold可設置)的對象會移到年老代中,沒有達到值的複製到To區,經過GC後,Eden和From被清空。之後,From和To交換角色,新的From即爲原來的To塊,新的To塊即爲原來的From塊,且新的To塊中對象年齡加1。永遠有一個survivor space是空的,另一個非空的survivor space無碎片。

爲什麼要這麼做?

  • 沒有Survivor區,eden區對象直接去老年代,造成老年代頻繁FGC。
  • 一個Survivor容易使得Survivor的空間碎片化,因爲eden區又存活對象,Survivor區也有存活對象,輔助的時候就會存在碎片化空間。
  • 即若只分一塊Survivor,在清除Survivor區已死亡的對象時,因爲此刻的Survivor區還有存活的對象,清除要比分兩塊Survivor麻煩,兩塊的情況,回收時只需將存活的對象移走,剩下的對象直接清理即可。
  • 另外,分成兩塊Survivor,From和To分工明確,邏輯理解和技術實現較簡單。

參考博客

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