ゴミコレクターのコピー
-
09-10-2019 - |
質問
コピーゴミコレクターはどのようにしてメモリの断片化を避けますか?また、ヒープスペースの使用にどのような結果がありますか?
私の理解から、コピーガベージコレクターは、ヒープからヒープの別のセクションにすべての到達可能なオブジェクトをすべてコピーします。取り残されたすべてのオブジェクトは、もはや必要ではなく、したがって削除されます。
これが正しい理解である場合、これはどのようにしてメモリの断片化を回避しますか?
このプロセスは、コピーしたすべてのアイテムの複製があるため、多くのヒープスペースを使用する必要があります。
解決
これが正しい理解である場合、これはどのようにしてメモリの断片化を回避しますか?
なぜなら、オブジェクトを「新しいヒープ」にコピーすると、ギャップを残さずにそれらを互いに隣接させるからです。
このプロセスは、コピーしたすべてのアイテムの複製があるため、多くのヒープスペースを使用する必要があります。
収集プロセス中のみ。それを行った後、すべての「オリジナル」が扱われ、そのスペースが再び解放されます。
さらに、このようなガベージコレクターは「世代」のようなものであることがよくあります。コピーガーベッジコレクションは短命のオブジェクトで使用され、長寿命のオブジェクトは異なって扱われます。これにより、スペースの問題を容易にするだけでなく、コレクションに時間がかかるようにすることができます。
他のヒント
あなたの基本的な理解は正しいです。到達可能なオブジェクトをコピーすると、1つのブロックに空きスペースを残すことができるため、断片化を回避します。多くのスペースが必要です。実際、スペースを2倍に潜在的に簿記に変更する必要があります。
メモリの断片化は、2つのアクティブなチャンクの間にメモリのチャンクが扱われると発生します。 SOのような記憶のブロックを考えてください...
AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC
Bが不要になったと仮定します。 Bが使用していたスペースを解放すると、
AAAAAAAAAAAAAAAA----CCCCCCCCCCC
今、私たちはかなり小さなオブジェクトしか入れることができないギャップがあります。コピーするガベージコレクターは、私たちが持っているように物事を動かしているかもしれません...
AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here
)
ほとんどの最新のコレクターは、物事を屋内で動かすことができます。つまり、Bの古いスペースを取り上げるためにCを「シフト」する方法を確認できます。したがって、メモリオーバーヘッドはありません。