Копирование сборщика мусора - PullRequest
1 голос
/ 08 декабря 2010

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

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

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

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

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

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

1 голос
/ 08 декабря 2010

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

AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC

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

AAAAAAAAAAAAAAAA----CCCCCCCCCCC

Теперь у нас есть пробел, в который мы можем помещать только довольно маленькие объекты. Копирующий сборщик мусора может перемещать вещи так,что у нас есть ...

AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here)

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

1 голос
/ 08 декабря 2010

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

...