Mark-and-sweep алгоритм сборки мусора

220
15 февраля 2017, 22:03

Насколько я понимаю, есть два фундаментальных подхода к сборе мусора:

  1. Copying collectors
  2. Mark-and-sweep

Оба алгоритма описываются в этой статье. По второму алгоритму автор статьи пишет:

  • Объекты аллоцируются в памяти
  • Нужно запустить GC
  • Приложение приостанавливается
  • Сборщик проходится по дереву объектов, помечая живые объекты
  • Сборщик проходится по всей памяти, находя все не отмеченные куски памяти, сохраняя их в "free list"
  • Когда новые объекты начинают аллоцироватся они аллоцируются в память доступную в "free list"

Если я правильно понимаю, то объекты, которые необходимо удалить, переносятся в "free list". Но где, собственно, происходит удаление этих объектов? Или они явно не удаляются, а просто перезаписываются при создании новых объектов?

Answer 1

Насколько я понимаю, нет необходимости производить дополнительные операции по удалению объектов в памяти. JVM будет создавать новые объекты на месте старых.

Статья о том, как производится создание и удаление объектов в C++

The delete operator does not actually delete anything. It simply returns the memory being pointed to back to the operating system. The operating system is then free to reassign that memory to another application (or to this application again later).

Думаю в java аналогично, только там не операционная система, а jvm. (Не совсем уверен, буду рад, если кто поправит)

Answer 2

Если объект перестал быть доступным по сильной ссылке (strong reference), то он может быть собран сборщиком мусора. Сборщик мусора может вызвать у этого объекта метод finalize. Данный метод, потенциально, может восстановить объект - сделать его доступным по сильной ссылке (strong reference).

Сборщик помечает память как "свободная", какие-то дополнительные меры по очистке памяти сборщик мусора не производит.

При создании нового объекта в момент инициализации будет произведена установка всех полей в значение по умолчанию.

Если необходимо удалить секретную информацию (пароль, ключ и т.д.), то необходимо делать это самостоятельно и как можно раньше. Так как в случае дампа памяти она может стать доступна. Так же часть информации может быть скопирована в другое место кучи и очистить "старую" область будет уже невозможно.

Answer 3

Место в памяти перезаписывапется. Точнее помечается свободным и очищается в момент, когда коллектор это делает(сразу или после). При этом если они выжившие или старые, то копируются в нужные области.

READ ALSO
Как запускать jSSLKeyLog for Wireshark?

Как запускать jSSLKeyLog for Wireshark?

Пожалуйста, поясните инструкцию: http://jsslkeylogsourceforge

274
Ошибка unfortunately при неправильной верстке Layout?

Ошибка unfortunately при неправильной верстке Layout?

Добрый день, работаю в Eclipse с ADT-для разработки мобприложения под Android, с бэкендом проблем не возникает, но при редактировании

200
MediaSource в ExoPlayer2

MediaSource в ExoPlayer2

У меня возникли вопросы насчет ConcatenatingMediaSourceМне нужно воспроизвести несколько видео и каждый раз когда заканчивается одно видео, я должен...

250