Куча, не куча и стек .. тонкости сборки мусора

Я занимался сборкой мусора в java (горячая точка jdk 6 JVM). У меня есть несколько вопросов, которые, я надеюсь, сообщество поможет мне решить.

Что я понимаю:

1) Куча делится на

а) Молодое поколение - Эдем и выживший: новые объекты и массивы создаются в молодом поколении. Незначительная сборка мусора будет работать в молодом поколении. Объекты, которые все еще живы, будут перемещены из области Эдема в область выживания.

б) Старое поколение/постоянное поколение: основная коллекция будет перемещать все еще живые объекты из молодого поколения в старое поколение.

2) Не куча делится на

    a)Code Cache
    b)Perm generation.

Что я хочу знать:

1)what if survivor gets full..how will minor garbage collection work.

2)When and how is the perm generation garbage collected.
3)Also what happens to the stack..where is it stored or residing?How is its size controlled?

person Rips    schedule 25.02.2014    source источник
comment
если выживший заполнится, то объекты будут перемещены в старое поколение.   -  person BevynQ    schedule 25.02.2014
comment
У вас больше одного вопроса.   -  person Jabir    schedule 25.02.2014


Ответы (3)


  1. Когда пространство выжившего заполнено, объекты перемещаются в старое поколение. Хотя технически в большинстве случаев объект перемещается из оставшегося пространства в старое поколение не потому, что оставшееся пространство заполнено, а потому, что объект пережил определенное количество второстепенных коллекций, обычно 10–15.
  2. Очень редко. В основном это двоичный код для классов Java, поэтому место может быть освобождено только в том случае, если из памяти выгружено несколько классов. Большинство программ используют один и тот же набор классов на протяжении всей жизни программы, поэтому сбор постоянного поколения обычно является пустой тратой времени. По сути, Java будет собирать здесь коллекцию только в том случае, если ей вот-вот не хватит памяти.
  3. Стек находится за пределами кучи, и его размер определяется тем фактом, что объекты хранятся в стеке только в том случае, если гарантировано их ограниченное время жизни. В основном это локальные переменные. Предположим, у вас есть локальная переменная StringBuilder, которую вы используете для создания возвращаемого значения метода. Вы никогда не передаете его вне своего собственного метода и вызываете stringBuilder().toString() для создания нового объекта в конце метода. Поскольку Java может сказать, что объект StringBuilder не переживет выполнение метода, он может поместить его в стек и немедленно освободить, когда метод вернется, вместо того, чтобы передавать его сборщику мусора.
person andrewdotn    schedule 25.02.2014
comment
спасибо за ответ ... для части 2 выгрузка классов произойдет только в том случае, если приложение не развернуто? Я прав? Я проверял одно из своих приложений, где в перманентном графике генерации, захваченном jconsole, есть зигзагообразный график ... как вы объясните это...может ли это быть из-за стажеров, которые также проживают в пермском поколении? - person Rips; 25.02.2014
comment
@Rips Да, место может быть освобождено в постоянном поколении после отмены развертывания приложения, но детали сильно зависят от того, какой сборщик мусора вы используете для старого поколения. постоянная генерация в любом случае исчезла с Java 8. - person andrewdotn; 25.02.2014
comment
Если мы говорим о HotSpot JVM, то невозможно разместить объект StringBuilder в стеке. JVM может встраивать все методы StringBuilder и преобразовывать свои поля в локальную переменную в рамках метода. Таким образом, действительно, объект StringBuilder не будет размещаться в куче. Тем не менее, временный char[], используемый для составления строки, в любом случае будет размещен в куче. - person Alexey Ragozin; 26.02.2014

Размер стека контролируется путем фиксации в точке его создания. Если вы когда-нибудь попытаетесь использовать больше места, чем доступно в стеке, вы получите исключение «переполнение стека».

person Gabe    schedule 25.02.2014

Стек — это часть памяти. В этом стеке создается локальная автоматическая переменная и передаются аргументы метода. Когда процесс запускается, он получает размер стека по умолчанию, фиксированный для каждого процесса. В современных операционных системах, как правило, размер стека по умолчанию составляет 1 МБ, чего достаточно для большей части процесса. В ненормальных условиях превышен лимит стека. Это известно как переполнение стека.

person Rips    schedule 26.03.2014