2010-12-07 5 views
1

Как копировальный сборщик мусора избегает фрагментации памяти? Кроме того, какие последствия для использования в кучном пространстве?Копирование сборщика мусора

С моей точки зрения, копировальный сборщик мусора, копирует все доступные объекты из кучи в другую часть кучи. Все оставшиеся объекты больше не нужны и, таким образом, удаляются.

Если это правильное понимание, как это избежать фрагментации памяти?

Этот процесс должен использовать много кучи, потому что он будет иметь дубликаты всех элементов, которые он скопировал, правильно?

+0

В вики перечислены некоторые «за» и «против»: http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Moving_vs._non-moving – delnan 2010-12-07 22:53:12

ответ

2

Если это правильное понимание, как это избежать фрагментации памяти?

Потому что, когда вы копируете объекты в «новую кучу», вы придерживаетесь их рядом друг с другом, не оставляя пробелов.

Этот процесс должен использовать много кучи, потому что он будет иметь дубликаты всех элементов, которые он скопировал, правильно?

Только в процессе сбора. После того, как вы это сделали, все «оригиналы» освобождены, и это пространство снова освободится.

Кроме того, сборщики мусора, подобные этому, часто являются «поколением» - копирование мусора собирает на короткоживущих объектах, причем более длительные объекты обрабатываются по-разному. Это помогает облегчить проблему пространства, а также сделать сборку меньше времени.

1

Ваше основное понимание верное. Это позволяет избежать фрагментации, поскольку при копировании достижимых объектов она может быть затем собрана вместе, оставив свободное пространство в одном блоке. он требует много места, на самом деле он требует потенциально 2x пространства плюс некоторые изменения для бухгалтерии.

1

Фрагментация памяти происходит, когда фрагменты памяти освобождаются между двумя активными кусками. Подумайте о таком блоке памяти ...

AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC 

Предположим, что B больше не нужен. Если освободить пространство, B использовал мы иметь что-то вроде ...

AAAAAAAAAAAAAAAA----CCCCCCCCCCC 

Теперь у нас есть разрыв, который мы можем только положить сравнительно небольшие объекты. Процесс копирования сборщик мусора может перемещать вещи вокруг так, что мы есть ...

AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here)

Большинство современных коллекционеров может передвигать предметы на месте. То есть вы можете увидеть, как C можно «сдвинуть», чтобы заняться старым пространством B, и, таким образом, накладные расходы на память отсутствуют.