Что заставляет объекты переходить от молодого поколения к старому поколению

#java #garbage-collection #jvm

#java #сбор мусора #jvm

Вопрос:

После многих циклов GC объекты, которые сохранились в молодом поколении, перемещаются в пространство памяти старого поколения.

Пожалуйста, уточните, за это отвечает Minor GC? или основной GC?

Ответ №1:

Пожалуйста, уточните, за это отвечает Minor GC? или основной GC?

Любой из них отвечает за перемещение объекта из молодого поколения в старое поколение.

Посмотрите раздел «Общий процесс сборки мусора» @ учебное пособие по сборке мусора oracle

введите описание изображения здесь

Краткие сведения:

  1. Во-первых, любые новые объекты выделяются в пространство eden. Оба оставшихся в живых пространства начинаются пустыми.

  2. Когда пространство eden заполняется, запускается небольшая сборка мусора

  3. Объекты, на которые ссылаются, перемещаются в первое оставшееся в живых пространство. Объекты, на которые нет ссылок, удаляются при очистке пространства eden.

  4. При следующем второстепенном GC то же самое происходит для пространства eden. Объекты, на которые нет ссылок, удаляются, а объекты, на которые есть ссылки, перемещаются в оставшееся пространство. Однако в этом случае они перемещаются во второе оставшееся в живых пространство (S1)

  5. При следующем второстепенном GC повторяется тот же процесс. Однако на этот раз оставшиеся в живых пространства переключаются. Объекты, на которые ссылаются, перемещаются в S0. Выжившие объекты устарели. Eden и S1 очищены.

  6. После незначительного GC, когда старые объекты достигают определенного возрастного порога (8 в этом примере), они переходят от молодого поколения к старому поколению.

  7. Поскольку продолжают возникать незначительные GCS, объекты будут по-прежнему продвигаться в пространство старого поколения.

  8. В конце концов, на старом поколении будет выполнен основной GC, который очищает и уплотняет это пространство.

Ответ №2:

Объекты могут быть перемещены из молодого в постоянное пространство либо в незначительном GC (молодое пространство), либо в полном GC (все). Основная коллекция GC собирается только в выделенном пространстве.

Меньшие объекты создаются в пространстве Eden, большие объекты, например, массивы, находятся в постоянном пространстве.

Когда пространство Eden очищается, выжившие объекты копируются в выжившие пространства. Они копируются взад и вперед между двумя оставшимися в живых пространствами до тех пор, пока их возраст (количество скопированных раз) не достигнет порогового значения, и в этом случае он копируется в постоянное пространство.

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

Учитывая размер (коэффициент выживаемости), размер оставшегося в живых всегда будет больше, чем eden

Коэффициент выживаемости — это то, насколько меньше пространство выживших, чем пространство Eden. например -XX:SurvivorRatio=8 , означает, что пространство выживших составляет 1/10 молодого поколения. Существует два оставшихся в живых пространства (1/10 каждого), а пространство Eden в 8 раз больше (8/10)

Даже если оставшееся в живых пространство было больше, чем Eden, имеет значение количество свободного места в оставшемся в живых. Например, у вас может быть пространство для оставшихся в живых, которое заполнено на 90% (поскольку в нем все еще есть объекты из последних N коллекций)

Итак, будет ли когда-нибудь сценарий, при котором объекты напрямую копируются из eden в Old, если объекты меньше по размеру (не огромные)?

Если вы сделаете оставшиеся в живых пространства достаточно маленькими, чтобы каждый раз запускать полную коллекцию, объекты перейдут из Eden в Tenured. Я не рекомендую делать это.

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

1. Последний момент не так: объекты просто сохраняются без старого поколения GC.

2. @MarkoTopolnik это полный GC, который проверяет каждый объект. Я никогда не видел, чтобы это было иначе.

3. @peterlawrey Спасибо за ваш ответ. Не могли бы вы предоставить дополнительную информацию об этом: — Младший GC — отвечает за управление молодым поколением, основной GC — отвечает за управление пространством старого поколения. Я в замешательстве от работы с полным GC, в какой-то ссылке говорится, что она управляет пространством кучи (молодое старое поколение), немногие говорят, что она управляет поколением perm.

4. @RohitShekhar Полный GC может означать, что классы в Perm Gen очищаются. Любой GC может, но полный GC более вероятен