回答:
基本的に、その背後にあるアルゴリズムは何ですか?
基本的には、マークアンドスイープアルゴリズムであり、別個のスレッドで「ちょうど」同時に実行されます。
その主題に関する研究論文に関して:
私の知る限り、Java G1ガベージコレクターはいわゆるヒープ領域を使用して、全世界の一時停止を回避しています。私が見る方法は、クリーンアップを実行するGCによって領域の1つがロックされている間、メモリ割り当ては別の領域で行われます。
ジェレミー・マンソンの説明を次に示します。
原理は簡単です。コレクターはヒープを固定サイズの領域に分割し、それらの領域のライブデータを追跡します。ポインターのセット(「記憶されたセット」)を領域に出し入れします。GCが必要であると判断されると、最初にライブデータの少ない領域が収集されます(つまり、「ガベージファースト」)。多くの場合、これは1つのステップで領域全体を収集することを意味します。領域へのポインタの数がゼロの場合、その領域をマークまたはスイープする必要はありません...
IBMのリアルタイムJVMは、メトロノームと呼ばれるガベージコレクターを使用します。これは、GCアクティビティを個別のクォンタムに分割し、アプリケーション処理とインターリーブします。したがって、基本的には、定期的な(および非決定的な)世界停止GCが一時停止する代わりに、GCが並行して実行されている間、アプリケーションの実行速度が若干遅くなります。
動的な最適化を行い、ハードリアルタイムの要件を満たしている別のGCがありますが、見つけることができる唯一の参照はここにあります(ACMメンバーシップが必要です)。
興味深い同時リアルタイムガベージコレクターはstoplessです。従来のマークアンドスイープアプローチを使用しますが、マルチプロセッサシステムで使用するように設計されており、ロックフリーの並行マルチスレッドをサポートしています。
これが機能する理由は、JavaではGCのみがGC参照を含むメモリを解放できるためです。つまり、別のスレッドでオブジェクトを安全に読み取ることができる限り、スタック上の参照を監視するためにプログラムを一時停止するだけで済みます。
突然変異については、何らかの形でコピーオンライトを実装して、変更についてGCに通知することをお勧めします。