所謂的「終極算法」其實就是當前 JVM 採用的分代收集算法,但這並非真正的終點。隨著技術演進,未來必然會出現更優秀的演算法,這也是技術大牛們持續探索的方向。那麼,分代收集算法究竟是如何處理垃圾回收(GC)的呢?
分代收集算法的核心思想是針對物件的不同特性採用適合的演算法,它並非創造了新演算法,而是將前三種經典演算法(標記-清除、複製、標記-整理)進行實戰組合。首先,我們將堆中物件按生命週期長短分為三類:
JVM 將堆劃分為新生代(年輕代)與老年代(年老代),方法區獨立存在。夭折與老不死物件位於 Java 堆,不滅物件位於方法區。JVM 規範要求對堆實現 GC,但對方法區 GC 不強制,因此若 JVM 未實現方法區 GC,不滅物件將真正「不滅」。分代收集算法主要針對 Java 堆(新生代與老年代)設計。
新生代物件存活率低,極適合使用複製演算法。為解決 50% 記憶體浪費問題,HotSpot 採用 8:1:1 的 Eden、From Survivor、To Survivor 結構:

若存活物件超過 Survivor 容量,多餘物件直接進入老年代作為「備用倉庫」。
老年代物件存活率極高,複製演算法不再適用(無備用空間且複製成本高)。因此採用標記-整理或標記-清除演算法,雖效率較低,但能解決記憶體碎片問題。
物件晉升老年代的兩大條件:
方法區(永久代)主要回收廢棄常量與無用類。回收條件嚴格,且採用與老年代類似的標記-清除/整理演算法。JDK 8 起永久代被元空間取代,但回收邏輯類似。
由於老年代與永久代回收效果較差且增長緩慢,通常經過多次 Minor GC 才觸發一次 Full GC。
分代收集算法是 JVM GC 的基石,理解其原理對排查記憶體溢出、優化 GC 停頓至關重要。下一章將探討具體的垃圾收集器實現(如 Serial、Parallel、CMS、G1 等)。
作者:zuoxiaolong(左潇龍)
出處:博客園左潇龍的技術博客