----- На следующий день -----
————————————
Давайте рассмотрим эти три вопроса вместе.
Вопрос 1: Какие из них должны быть переработаны?
Для начала нам нужно узнать, как какой мусор нужно перерабатывать? Существует два алгоритма определения необходимости переработки объекта. Один из них — алгоритм подсчета ссылок, а другой — алгоритм анализа достижимости.
алгоритм подсчета ссылок
Алгоритм подсчета ссылок очень прост: он определяет важность объекта, записывая количество ссылок на объект. Если на объект ссылаются другие объекты, его счетчик ссылок увеличивается на 1. Если ссылка на объект удаляется, его счетчик ссылок уменьшается на 1. Когда счетчик ссылок объекта равен 0, объект будет переработан. .
Что не так с подсчетом ссылок? Когда два объекта ссылаются друг на друга, счетчики не равны нулю, потому что они ссылаются друг на друга, что приведет к тому, что два объекта не будут переработаны.
Поэтому виртуальная машина Java использует другой метод для определения того, является ли объект живым или нет, который представляет собой алгоритм анализа достижимости.
Алгоритмы анализа достижимости
Алгоритм анализа достижимости, в первую очередь для определения рядаКорневые объекты (корни GC), и из корневого объекта в качестве отправной точки для поиска записи на основе эталонной связи между объектамиЭталонная цепочка, Объект в цепочке ссылок сохраняется, а объект, не входящий в цепочку ссылок, считается перерабатываемым объектом.
Здесь уместна аналогия: алгоритм анализа достижимости подобен очистке грозди винограда, мы можем снять гроздь винограда с ветки, они похожи на цепочку ссылок, а объекты, не связанные с цепочкой ссылок, похожи на разбросанные Виноград в пруду можно перерабатывать.
- Объекты, на которые есть ссылки в стеке виртуальной машины(переменные, параметры и т. д., используемые методом прогона)
- Объект, на который ссылается статическое свойство класса в области метода(поле объявлено со статическим ключевым словом)
- Объект, на который ссылается константа в области метода, (то есть поле, объявленное ключевым словом final)
- Объекты, на которые есть ссылки в собственном стеке методов(родной метод)
- Ссылка внутри виртуальной машины Java.(Вещи внутри системы конечно можно использовать как корень)
Вопрос 2: Каковы важные алгоритмы сборки мусора?
Научившись определять, какой мусор в памяти нужно собирать, нам нужно освоить несколько важных алгоритмов сборки мусора.
алгоритм маркировки-развертки
Метод пометки-зачистки — самый простой алгоритм сборки мусора, в общем случае он делится на два этапа:
- отметка
Отметьте все объекты, которые необходимо переработать (серым цветом), то есть сделайте оценку мусора.
- Чисто
Очистите выделенную серым цветом часть.
Следует отметить, что так называемая очистка на самом деле не требует очистки байтов всей памяти, достаточно очистки байтов свободного объекта.начальный конечный адресзапишите это вбесплатный список, указывая на то, что эта память свободна.
- Преимущество в быстроте, и вам нужно только сделать отметку, чтобы узнать, какой кусок нужно переработать, но его недостаток также фатальный.
- Главных его недостатков два: один в том, что эффективность исполнения нестабильна, а другой в том, что он будет задействоватьпроблема с фрагментацией памяти.
Некоторые люди могут спросить, что означает фрагментация? Стек, описанный выше, хотя пространство очищается методом очистки метки, очищенная память представляет собой большое количество прерывистых фрагментов памяти, таких как следующий объект, хотя целое имеет биты, но его нельзя вставить из-за прерывности. , что является самым большим недостатком алгоритма маркировки и очистки.
Так называемый алгоритм копирования тегов и алгоритм сортировки тегов являются улучшениями недостатков алгоритма удаления тегов, поэтому говорят, что алгоритм удаления тегов является самым основным методом.
алгоритм маркировки-сопоставления
В отличие от алгоритмов пометки и очистки, алгоритмы пометки и очистки являются мобильными. Он переместит все уцелевшие объекты в один конец пространства памяти, а затем очистит память за границей.
- отметка
- переехать
Каковы недостатки? Алгоритм пометки для очистки включает в себя перемещение объектов.На этапе очистки ссылки должны обновляться по мере перемещения доступных объектов. Эффективность низкая.
алгоритм пометки-копии
Алгоритм пометки-копии, отличающийся от предыдущего сравнения, делит пространство памяти на два блока, копирует уцелевшие объекты в используемой памяти в неиспользуемый блок памяти во время сборки мусора, а затем очищает используемый блок памяти. , Все объекты в блоке памяти. Наконец, две памяти меняются ролями, и сборка мусора завершается.
В целом его можно разделить на следующие этапы:
- копировать
- пустой
- транслокация
Нетрудно заметить, что алгоритм репликации тегов не требует наличия тегов для повышения эффективности. Кроме того, у него нет проблем с фрагментацией параметров.
но. Недостаток алгоритма копирования метки также очень очевиден, он требует двойного пробела.
Вопрос 3: Каков конкретный процесс сборки мусора?
Поскольку сказано, что виртуальная машина JVM не будет использовать определенный алгоритм отдельно, а будет комбинировать три алгоритма, чтобы заставить их работать вместе, конкретной реализацией является механизм сборки мусора поколений в виртуальной машине Java.
Как показано на рисунке выше, это разделение памяти кучи Java. Зачем нужно делить территорию таким образом? Это связано с тем, что у наших java-объектов разная продолжительность жизни, некоторые из них могут использоваться в течение длительного времени, а некоторые могут быть выброшены, когда они израсходованы. Итак, мы можем согласноРазличные характеристики жизненного цикла, выполнять различные стратегии сборки мусора.
В целом у нового поколения сборка мусора более частая, а у старого поколения сборка мусора инициируется только на долгое время. Молодое поколение имеет дело с объектами, которые умирают в ближайшем будущем, в то время как старшее поколение перерабатывает более ценные объекты, которые сохранятся в течение длительного времени.
Приведу наглядный пример: новое поколение утилизирует мусор так же, как занимается бытовым мусором, а выбрасываемый старым поколением мусор больше похож на новогоднюю уборку.В доме слишком много мусора, чтобы убирать его снова . Мусор, убранный генеральной уборкой, давно хранится дома и, возможно, очень пригодился, а теперь, когда он вышел на пенсию, его убирают к Новому году, а потом убирают.
Каждый раз, когда мы создаем объект, он будет занимать определенное количество памяти в Эдемском саду, и постепенно Эдемский сад будет заполняться. Когда мы снова захотим создать объекты, мы обнаружим, что места недостаточно.
В это время будет запущена сборка мусора, а сборка мусора, запущенная новым поколением, будет вызванаMinorGC.
После срабатывания MinorGC Eden Park выступитАнализ доступности, таким образом зная, какие объекты следует очистить как мусор.
Здесь MinorGC использует алгоритм копирования меток, который сохраняет полезные объекты в области выживших, а затем очищает объекты в Эдемском саду.
Счастливчики, которые войдут в зону выживания, будут отмечены «счастливым значением», которое показывает, сколько раз они сопротивлялись очистке.
Наконец, область выжившего в и область выжившего также должны взаимодействовать друг с другом.Это не относится к обмену физическими местоположениями, а к тому, что определения двух были обменены.В следующий раз тот, что слева, область выжившего до, а тот, что справа, - это область выжившего из. .
Другими словами, область выжившего всегда пуста.
Давайте смоделируем еще несколько раз, чтобы усилить впечатление:
Если снова появится много предметов, Эдемский сад снова полон!
Это вызовет MinorGC, переместит выживших в зону выживания, а все остальные будут очищены.
Наконец, не забывайте, что «местоположение» области выжившего от и области выжившего до нужно снова поменять местами.
...
Друзья, которым понравилась эта статья, приглашаем обратить внимание на номер пабликапрограммист маленький серый, смотрите больше захватывающего контента