2010-12-07 5 views
1

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

コピーガベージコレクタは、すべての到達可能なオブジェクトをヒープからヒープの別のセクションにコピーします。残されたすべてのオブジェクトはもはや必要なくなり、したがって削除されます。

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

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

+0

ウィキはいくつかの長所と短所を挙げています:http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Moving_vs._non-moving – delnan

答えて

2

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

オブジェクトを「新しいヒープ」にコピーすると、ギャップを置かずにすぐ隣に貼り付けることができます。

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

収集プロセス中のみです。あなたがそれをした後、すべての "オリジナル"は割り当てが解除され、そのスペースは再び解放されます。

さらに、このようなガベージコレクタは「世代別」です。コピーガーベジコレクションは短命オブジェクトで使用され、長命オブジェクトは別の方法で扱われます。これはスペースの問題を緩和し、コレクションの時間を短縮します。

1

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

1

メモリ断片化は、2つのアクティブなチャンクの間でメモリのチャンクが割り当て解除された場合に発生します。そのような記憶のブロックを考えてみましょう。

AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC 

Bはもう必要ないとします。私たちは今、Bが、私たちのようなものを持っ使用していたスペース...

AAAAAAAAAAAAAAAA----CCCCCCCCCCC 

を解放した場合、我々は我々だけではなく、小さなオブジェクトを置くことができ、ギャップを持っている。そのため、コピーガベージコレクタは、周りのものを移動するかもしれない、我々

AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here

最近のほとんどのコレクターはその場で物事を動かすことができます...持っています。つまり、Bの古いスペースを取るためにCが「シフト」される可能性があることが分かります。したがって、メモリオーバーヘッドはありません。

関連する問題