#java #garbage-collection #jvm
#java #сбор мусора #jvm
Вопрос:
После многих циклов GC объекты, которые сохранились в молодом поколении, перемещаются в пространство памяти старого поколения.
Пожалуйста, уточните, за это отвечает Minor GC? или основной GC?
Ответ №1:
Пожалуйста, уточните, за это отвечает Minor GC? или основной GC?
Любой из них отвечает за перемещение объекта из молодого поколения в старое поколение.
Посмотрите раздел «Общий процесс сборки мусора» @ учебное пособие по сборке мусора oracle
Краткие сведения:
-
Во-первых, любые новые объекты выделяются в пространство eden. Оба оставшихся в живых пространства начинаются пустыми.
-
Когда пространство eden заполняется, запускается небольшая сборка мусора
-
Объекты, на которые ссылаются, перемещаются в первое оставшееся в живых пространство. Объекты, на которые нет ссылок, удаляются при очистке пространства eden.
-
При следующем второстепенном GC то же самое происходит для пространства eden. Объекты, на которые нет ссылок, удаляются, а объекты, на которые есть ссылки, перемещаются в оставшееся пространство. Однако в этом случае они перемещаются во второе оставшееся в живых пространство (S1)
-
При следующем второстепенном GC повторяется тот же процесс. Однако на этот раз оставшиеся в живых пространства переключаются. Объекты, на которые ссылаются, перемещаются в S0. Выжившие объекты устарели. Eden и S1 очищены.
-
После незначительного GC, когда старые объекты достигают определенного возрастного порога (8 в этом примере), они переходят от молодого поколения к старому поколению.
-
Поскольку продолжают возникать незначительные GCS, объекты будут по-прежнему продвигаться в пространство старого поколения.
-
В конце концов, на старом поколении будет выполнен основной 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 более вероятен