1

コピーガベージコレクターはどのようにしてメモリの断片化を回避しますか?また、ヒープスペースの使用にはどのような影響がありますか?

私の理解では、ガベージコレクターをコピーすると、到達可能なすべてのオブジェクトがヒープからヒープの別のセクションにコピーされます。取り残されたすべてのオブジェクトは不要になり、削除されます。

これが正しい理解である場合、これはどのようにしてメモリの断片化を回避しますか?

このプロセスでは、コピーしたすべてのアイテムが複製されるため、多くのヒープスペースを使用する必要があります。

4

3 に答える 3

2

これが正しい理解である場合、これはどのようにしてメモリの断片化を回避しますか?

オブジェクトを「新しいヒープ」にコピーするときは、ギャップを残さずにオブジェクトを隣り合わせに貼り付けるためです。

このプロセスでは、コピーしたすべてのアイテムが複製されるため、多くのヒープスペースを使用する必要があります。

収集プロセス中のみ。それが完了すると、すべての「オリジナル」の割り当てが解除され、そのスペースが再び解放されます。

さらに、このようなガベージコレクターは、多くの場合「世代別」です。ガベージコレクションのコピーは、有効期間の短いオブジェクトで使用され、有効期間の長いオブジェクトは異なる方法で処理されます。これにより、スペースの問題が緩和されるだけでなく、コレクションの作成にかかる時間が短縮されます。

于 2010-12-07T22:56:00.603 に答える
1

あなたの基本的な理解は正しいです。到達可能なオブジェクトをコピーするときに、1つのブロックに空きスペースを残して、それらをまとめて閉じることができるため、断片化が回避されます。それは多くのスペースを必要とします、実際、それは潜在的に2倍のスペースと簿記のためのいくらかの変更を必要とします。

于 2010-12-07T22:54:20.777 に答える
1

メモリの断片化は、メモリのチャンクが2つのアクティブなチャンクの間に割り当て解除されたときに発生します。そのようなメモリのブロックを考えてください...

AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC

Bはもう必要ないと仮定します。Bが使用していたスペースを解放すると、次のようなものになります...

AAAAAAAAAAAAAAAA----CCCCCCCCCCC

これで、かなり小さなオブジェクトしか入れられないギャップができました。ガベージコレクターをコピーすると、物事が移動して、次のようになります...

AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here)。

最新のコレクターのほとんどは、物事をその場で動かすことができます。つまり、Cを「シフト」してBの古いスペースを占有する方法を確認できます。したがって、メモリのオーバーヘッドはありません。

于 2010-12-07T22:58:04.130 に答える