Если вы ищете базовый взгляд на то, что означает молодое поколение, старое поколение и постоянное поколение с точки зрения Java, то вы попали в нужное место.

Поколения? О чем мы здесь говорим?

Эти термины кажутся более подходящими для людей, чем для концепций программного обеспечения, но читайте дальше, и, надеюсь, они будут иметь больше смысла.

По сути, мы говорим здесь о сборке мусора Java.

Сборка мусора и Java

В языках программирования, таких как C, разработчики должны внимательно следить за памятью, выделяя и освобождая ее соответственно.

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

Вкратце, объекты в Java размещаются в куче (также известной как куча памяти). Алгоритм сборки мусора Java затем проходит через кучу и помечает объекты, которые используются JVM, а затем возвращается и освобождает память любого объекта, который не было отмечено.

Подробности этого алгоритма описаны в другой статье, но важна сама маркировка и тот факт, что куча распределяется на более мелкие части, называемые поколениями.

На приведенной выше диаграмме мы наконец видим термины «молодое поколение», «старое поколение» и «постоянное поколение». Если это выглядит устрашающе, не волнуйтесь; основные концепции на самом деле довольно интуитивно понятны.

Молодое поколение

На высоком уровне молодое поколение - это то, с чего начинаются все новые объекты. После того, как они выделены в коде Java, они переходят именно в этот подраздел, который называется пространство eden.

В конце концов, райское пространство заполняется предметами. На этом этапе происходит событие незначительной сборки мусора.

Здесь вступает в игру алгоритм маркировки, который я описал ранее. Некоторые объекты (те, на которые есть ссылки) отмечены, а некоторые (те, на которые нет ссылок) - нет. Те, которые были отмечены, затем переходят в другую подсекцию молодого поколения, называемую S0, из пространства выживших (обратите внимание, что само пространство выживших разделено на две части: S0 и S1. ). Те, что не помечены, удаляются автоматической сборкой мусора Java.

Он остается таким, пока пространство Эдема снова не заполнится; в этот момент начинается новый цикл. События предыдущего абзаца повторяются, но в этом цикле все немного по-другому. S0 был заполнен, поэтому все отмеченные объекты, которые выживают как из пространства eden, так и из S0, фактически переходят во вторую часть пространства выживших, называемую S1. На диаграмме ниже мы видим, что они помечены как из области выжившего и в область выжившего соответственно.

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

Хорошо, давайте сделаем здесь глубокий вдох, потому что во время следующего цикла сборки мусора это становится немного странным, но не так уж и плохо. По сути, когда пространство eden снова заполняется и запускается еще одна незначительная сборка мусора, мы не помещаем все отмеченные (упомянутые) объекты в S1 ; скорее, поменяны местами «от» и «к оставшимся в живых».

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

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

Старое поколение

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

Когда объекты получают сборщик мусора из старого поколения, происходит серьезное событие сборки мусора.

Давайте посмотрим, как выглядит переход от выжившего молодого поколения к старому.

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

Старое поколение состоит только из одного раздела, который называется постоянное поколение. Вот почему в разговоре или чтении иногда эти два термина стали в основном взаимозаменяемыми.

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

Постоянное поколение

Итак, вот большая проблема. Постоянное поколение не заполняется, когда объекты старого поколения достигают определенного порога и затем перемещаются (повышаются) в постоянное поколение. Опять же, это не так!

Напротив, постоянная генерация немедленно заполняется JVM метаданными, которые представляют классы и методы приложения во время выполнения.

JVM иногда может следовать определенным правилам для очистки постоянного поколения, и когда это происходит, это называется полной сборкой мусора.

Что такое мероприятие «останови мир»?

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

Когда выполняется второстепенная сборка мусора (помните: для молодого поколения) или серьезная сборка мусора (для старого поколения), мир останавливается; другими словами, все потоки приложения полностью останавливаются и должны ждать завершения события сборки мусора.

Все, ребята

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

Источник (и)