2025/09/05 00:55 Fil's Unbelievable Garbage Collector

ロボ子、Fil-Cのガベージコレクションについて、面白い情報が入ったのじゃ!

Fil-Cですか、博士。どのような点が面白いのでしょうか?

なんと、Fil-CはFUGC(Fil's Unbelievable Garbage Collector)という、すごい名前のガベージコレクタを使っているらしいぞ!

FUGC…すごい名前ですね。どのような特徴があるんですか?

FUGCは並列、並行、オンザフライ、グレースタック、ダイクストラ、正確、非移動という、てんこ盛りの機能を備えているのじゃ!

そんなにたくさん!一つずつ教えていただけますか?

まず並列というのは、複数のスレッドでマーキングとスイープを同時に行うことじゃ。並行は、マーキングとスイープをプログラムのスレッドとは別のスレッドで行うことじゃ。

なるほど、効率が良さそうですね。

オンザフライは、グローバルなstop-the-worldがない代わりに、「ソフトハンドシェイク」というものを使うらしいぞ。まるで秘密の握手みたいじゃな。

ソフトハンドシェイク…?初めて聞きました。

これは「ラギッドセーフポイント」とも呼ばれるらしい。すべてのスレッドでpollcheckコールバックが実行されるのを待つ仕組みじゃ。

セーフポイントに依存しているんですね。コンパイラが発行するPollcheckが重要になるわけですね。

その通り!そしてグレースタックは、スレッドスタックを修正するために再スキャンする必要があると想定することじゃ。

スタックもGCの対象になるんですね。

ダイクストラは、マーキング中にヒープ内のオブジェクトにポインタを格納すると、新しくポイントされたオブジェクトがマークされるというものじゃ。

変更を追跡して、GCが取りこぼさないようにするんですね。

正確というのは、GCがオブジェクトへのすべてのポインタを正確に検出すること。非移動は、GCがオブジェクトを移動しないことじゃ。

移動しないことで、ポインタの安定性が保たれるんですね。

FUGCコレクターループの流れも面白いぞ。GCトリガーを待って、ストアバリアをオンにしてソフトハンドシェイク、ブラックアロケーションをオンにしてソフトハンドシェイク…と続くのじゃ。

ストアバリアやブラックアロケーションなど、細かい制御をしているんですね。

FUGCは、ビットベクトルSIMDに基づくスイープアルゴリズムを使っているらしい。そしてCスタイル、Javaスタイル、JavaScriptスタイルのメモリ管理をサポートしているというから驚きじゃ!

色々なスタイルに対応しているんですね。柔軟性が高いですね。

`free`を呼び出すと、オブジェクトは解放されたものとしてフラグが立てられ、そのオブジェクトへの後続のアクセスはすべてトラップされるらしいぞ。二重解放もトラップされるし、解放しなくても自動的に回収される!

それはすごいですね!メモリ管理の安全性がかなり高そうですね。

さらに、FUGCは`stdfil.h`の`zgc_finq` APIでファイナライザーキューを、`zweak` APIで弱い参照を、`zweak_map` APIで弱いマップをサポートしているのじゃ!

ファイナライザーや弱い参照までサポートしているとは、至れり尽くせりですね。

まさに、FUGCは`free`の誤用に関して、可能な限り強力な保証を提供してくれる、頼もしい味方なのじゃ!

Fil-Cのメモリ管理はかなり先進的ですね。私もFUGCについてもっと勉強してみます。

ところでロボ子、FUGCって名前、なんだかお腹が空いてくるのじゃ。Fil's Unbelievable Garbage Collector… フィルさんの信じられないゴミ… ゴミ… おにぎり…

博士、それは少し強引すぎます!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。