Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

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

#java #jvm #сборщик_мусора


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


Copying collectors
Mark-and-sweep


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


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


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


Ответы

Ответ 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. (Не совсем уверен, буду рад, если кто поправит)

Ответ 2



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

Комментариев нет:

Отправить комментарий