(実際には) ガベージ コレクション システムでは、オブジェクトをメモリ内で移動させて、オブジェクトをより高密度にパックし、断片化の問題を回避する必要があります。
あなたが見ているのは、非常に大きく複雑な主題です。既存のリモート オブジェクト スタイル API を読むことをお勧めします。
参照を追跡するためのソリューションは、分散システムに存在するすべての障害モードに対処する必要があるため、複雑になります。JVM は、ネットワーク スイッチに問題が発生したためにヒープの半分が表示されないことに突然気付くことを心配する必要はありません。
設計を掘り下げると、多くの場合、さまざまな障害ケースをどのように処理したいかによって決まると思います。
コメントへの対応:
あなたの質問は、分散された方法でオブジェクトを保存することについて語っています。これは、まさに .NET リモート処理と CORBA のアドレスです。確かに、どちらのテクノロジーもこれらのオブジェクトの移行をサポートしていません (AFAIK)。しかし、どちらも、分散オブジェクト システムの重要な部分であるオブジェクト アイデンティティの概念を幅広く扱っています。つまり、システムのさまざまな部分がどのオブジェクトについて話しているかをどのように認識するかです。
私は Java ガベージ コレクターの詳細にあまり精通していません。Java および .NET ガベージ コレクターは、アプリケーションへの影響を最小限に抑えて最大のパフォーマンスを実現するために、かなり複雑になっていると思います。
ただし、ガベージ コレクションの基本的な考え方は次のとおりです。
- VM は、マネージド コードの実行をすべてのスレッドで停止します
- 既知の「ルート」のセット (静的変数、すべてのスレッドのローカル変数) から到達可能性分析を実行します。見つかったオブジェクトごとに、オブジェクト内のすべての参照に従います。
- 到達可能性分析によって識別されないオブジェクトはすべてガベージです。
- まだ生きているオブジェクトは、メモリ内で下に移動して密集させることができます。これは、これらのオブジェクトへの参照も新しいアドレスで更新する必要があることを意味します。ガベージ コレクションがいつ発生するかを制御することにより、VM は、問題を引き起こす可能性のある「空中」(つまり、マシン レジスタに保持されている) のオブジェクト参照がないことを保証できます。
- プロセスが完了すると、VM はスレッドの実行を再開します。
このプロセスの改良として、VM は世代別ガベージ コレクションを実行できます。この場合、オブジェクトの「経過時間」に基づいて個別のヒープが維持されます。オブジェクトはヒープ 0 で開始し、いくつかの GC に耐えた場合、ヒープ 1 に移行し、最終的にヒープ 2 に移行します (同様に - .NET は 3 世代のみをサポートします)。これの利点は、GC がヒープ 0 コレクションを非常に頻繁に実行できることであり、(ヒープ 2 に終わった) 長期間有効なオブジェクトがまだ生きている (ほぼ確実に生きている) ことを証明する作業を心配する必要がないことです。 .
同時実行ガベージ コレクションをサポートするための他の改良点と、GC がスケジュールされているときに実際にアンマネージ コードを実行しているスレッドに関する詳細があり、この領域がさらに複雑になります。