Java 透過 new、newarray 等指令創建對象,當不再使用時由 GC 回收。JVM 規範未強制特定 GC 技術,甚至允許無 GC 實現,但必須自動管理記憶體、避免碎片導致 OOM。
每個對象維護計數器,引用+1,失效-1,歸零即回收。致命缺陷:無法處理循環引用,且增減計數開銷大,現代 JVM 已棄用。
從根節點遍歷對象圖,標記所有可達對象;掃描堆,未標記者為垃圾回收。標記可存在對象頭或獨立位圖。
將存活對象向堆一端滑動,形成大塊連續空間。需更新引用,常透過「句柄表」間接寬址:引用指向句柄,句柄指向實體,移動時只改句柄。缺點:每次訪問多一次間接查找。
將堆劃為兩半,每次只用一半。滿時暫停,將存活對象複製到另一半,原半區全清空。優點:無碎片、分配極快(指針遞增)。缺點:記憶體利用率僅 50%。
結合複製與標記清除:
分代思想可套用於任何基礎算法,核心是「針對不同年齡對象採用不同策略」,大幅提升整體吞吐量與暫停表現。

圖示展示雙半區輪換、存活對象來回複製、垃圾整區清除的動態過程。