概要
Fil-CのFUGCは、並列・並行動作し、正確かつ非移動型のDijkstraバリア方式GC。 スレッド停止を最小限に抑え、独自のグレイスタックで効率的なマーク&スイープを実現。 safepointやstore barrierなど、最新のGC技術を多数導入。 C/Java/JavaScript風のメモリ管理機能(free, finalizer, weak ref等)もサポート。 使い勝手と安全性の両立を目指した設計。
FUGC(Fil's Unbelievable Garbage Collector)の特徴
- 並列処理 :マークとスイープを複数スレッドで同時実行
- 並行動作 :マーク&スイープはmutator(プログラム)スレッドとは別のスレッドで進行
- オンザフライ :グローバルなstop-the-worldは不要、ソフトハンドシェイクで最小限の介入
- グレイスタック方式 :スレッドスタックを再スキャンし、fixpoint収束までマーク処理を繰り返す設計
- Dijkstraバリア :ストアバリアのみ必要、ヒープへのポインタ格納時に新たな参照オブジェクトをマーク
- 正確なGC :スタックやグローバルのルートポインタをLLVMパス(FilPizlonator)で厳密に追跡
- 非移動型 :オブジェクト自体は移動せず、解放時のみcapabilityポインタをfree singletonへリポイント
- アドバンシングウェーブフロント :mutatorがGCの新たな作業を生まない設計
- インクリメンタル更新 :GC中に解放されたオブジェクトも即時回収
- safepoint活用 :pollcheckによる周期的な安全点、スレッド同期や信号配信も安全に管理
- 高速スイープ :bitvector SIMDによる圧倒的なスイープ速度、Verse heap構成を活用
FUGCのGCサイクル基本フロー
- GCトリガ待機
- ストアバリアON→ソフトハンドシェイク(no-opコールバック)
- ブラックアロケーションON→ソフトハンドシェイク(スレッドローカルキャッシュリセット)
- グローバルルートマーク
- ソフトハンドシェイク(スタックスキャン+キャッシュリセット)
- 全マークスタック空ならスイープへ、残っていればトレース継続
- マークスタック内各オブジェクトの参照先をマーク(スタック拡張も)
- マークスタックが空になるまで繰り返し
- ストアバリアOFF→スイープ準備→ソフトハンドシェイク(キャッシュリセット)
- スイープ実行
- 未スイープページからの割当はブラック、スイープ済みはホワイト
- 終了→次のGCトリガ待機
safepointインフラとスレッド安全性
- pollcheck :コンパイラが頻繁に挿入、速いパスは単なるロード&分岐
- ソフトハンドシェイク :全スレッドでpollcheckコールバック実行を要請
- enter/exit :システムコールや長時間ランタイム関数でのスレッドブロック対応
- stop-the-world :fork(2)やデバッグ時に利用可能(FUGC_STW環境変数)
- 信号配信 :safepointインフラで安全なsignal deliveryを実現
- スレッド同期 :GC中にヒープからポインタをロード→使用しても、次のpollcheck/exitまでメモリは削除されない安全設計
メモリ管理機能(Bonus Features)
- free対応 :free呼び出しで即座にtrap発生、解放後のアクセスも確実にtrap
- capabilityポインタをfree singletonへ付け替え、解放済みメモリの再利用も安全
- 二重freeもtrapで検出
- freeし忘れはGCで自動回収
- finalizer :zgc_finq APIでJava風ファイナライザキューを実装可能
- 任意のスレッドでファイナライザ処理を選択可能
- weak reference :zweak APIでJava同様の弱参照をサポート(reference queueは非対応)
- weak map :zweak_map APIでJavaScript WeakMap風の弱マップを実装
- Fil-Cのweak mapは全要素のイテレーションや要素数取得も可能
FUGCと他GC手法の比較・設計意図
- DLG(Doligez-Leroy-Gonthier)法との比較
- Dijkstraバリア+グレイスタックの採用でバリアコスト低減と直感的なアルゴリズム
- fixpoint方式だが、実運用では数回のイテレーションで収束
- bitvector SIMDによる高速スイープ
- マークよりスイープが圧倒的に高速(通常GC時間の5%未満)
- 幅広いメモリ管理モデル対応
- C/Java/JavaScriptスタイルのメモリ管理を柔軟にサポート
- 安全性と使いやすさの両立
- free後アクセスや二重freeを確実にtrap
- malloc/freeからGCへの移行時のリーク防止策も万全
まとめ
- Fil-CのFUGCは、現代的なスレッドセーフGC設計と多機能メモリ管理APIを両立
- 高速・安全・直感的なGCサイクルと、C/Java/JavaScript的プログラミング体験を両立
- freeの誤用検出・自動回収・ファイナライザや弱参照など、実用的な機能を網羅