常見迷思與事實
- 迷思:GC 比手動管理慢、會造成停頓、C/C++ 無法實作 GC。
- 事實:現代 GC 演算法 (增量式、分代式) 可避免長時間停頓;只配置不釋放的分配器極快 (僅移動堆頂指標);保守式掃描可在 C/C++ 實作 GC。
保守式垃圾回收原理
- 根集合掃描:掃描全域變數 (BSS/DATA 段)、當前棧空間、暫存器,找出可能指向堆區的位址。
- 指標識別:若某字長數值落在已配置堆區範圍內,視為潛在指標。寧可誤判非指標為指標 (漏收),不可誤判指標為非指標 (過早釋放)。
- 遞迴標記:從根集合出發,遞迴標記所有可達記憶體區塊。
- 回收未標記區塊:未被標記者即為垃圾,回收再利用。
為何 C/C++ 可行?
- 指標在記憶體中為位址值,特徵明確 (指向堆區範圍)。
- 根集合位置固定:全域/靜態變數在 BSS/DATA,區域變數在棧,易於定位掃描。
- 無需編譯器/語言支援,作為庫 (如 Boehm GC) 整合即可。
工程價值
實作優良 GC 可提升記憶體管理速度、減少總消耗、消除洩漏/雙重釋放/野指標等錯誤類別。知名專案 (如 GCC、Mono、大型遊戲引擎) 均有採用。
拓展視野
建議搜尋「Boehm GC」、「保守式垃圾回收」、「增量式 GC」相關論文與庫實作。理解 GC 算法能拓寬系統設計視角,即使不直接使用,也能寫出更健壯的手動管理代碼。