Подтвердить что ты не робот

MaxTenuringThreshold - как именно он работает?

Я весь день в Googling об этом. Но мне все еще не ясно, поэтому вопрос может показаться немного бредовым.

Ну.. мы знаем, что там мало основных областей памяти. Young, Tenured (Старый ген) и PermGen.

Молодой домен делится на Eden и Survivor (два из них). OldGen для выживших объектов.
Что касается MaxTenuringThreshold - он не позволяет объектам окончательно скопировать в пространство OldGen слишком рано.
Это довольно понятно и понятно.

Но что "MaxTenuringThreshold"... - как это точно работает?
Как сборщик мусора имеет дело с этими объектами, которые до сих пор сохраняются до MaxTenuringThreshold и каким образом? Где они расположены?
Объекты копируются обратно в места для выживания для сбора мусора.. или это происходит как-то иначе?

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

4b9b3361

Ответ 1

Каждый объект в куче Java имеет заголовок, который используется алгоритмом Garbage Collection (GC). Молодой космический сборщик (который отвечает за продвижение объекта) использует несколько бит (ов) из этого заголовка для отслеживания количества оставшихся объектов коллекций (32-разрядная JVM использует 4 бита для этого, 64-бит, возможно, еще немного).

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

Путешествие объекта имеет следующий шаблон:

  • выделено в eden
  • скопировано из eden в пространство выживания из-за молодого GC
  • скопировано из выживания в другое место выживания из-за молодого GC (это может произойти несколько раз)
  • продвигается от выживания (или возможного эдена) до старого пространства из-за молодого GC (или полного GC)

фактический порог владения динамически настраивается JVM, но MaxTenuringThreshold устанавливает верхний предел для него.

Если вы установите MaxTenuringThreshold = 0, все объекты будут продвинуты немедленно.

У меня несколько статей о сборке мусора java, там вы можете найти более подробную информацию.

Ответ 2

(Отказ от ответственности: это касается только HotSpot VM)

Как утверждает Алексей, фактически используемый порог владения определяется JVM динамически. В настройке очень мало значения. Для большинства приложений значение по умолчанию 15 будет достаточно высоким, так как обычно больше объектов выжить в коллекции. Когда многие объекты выживают в коллекции, оставшиеся в живых пространства переполняются непосредственно к старым. Это называется преждевременной рекламой и индикатором проблемы. Однако это редко можно решить, настроив MaxTenuringThreshold.

В таких случаях иногда SurvivorRatio может использоваться для увеличения пространства в пространствах оставшихся в живых, что позволяет на практике работать. Однако наиболее частое увеличение молодого поколения - единственный хороший выбор (с точки зрения конфигурации). Если вы смотрите с точки зрения кодирования, вам следует избегать избыточного распределения объектов, чтобы обеспечить работу по трудоустройству, как было разработано.

Чтобы ответить именно на то, что вы спросили: Когда объект достигает своего установленного JVM порогового значения, он копируется в старое. До этого он будет скопирован в пустое пространство для оставшихся в живых. Объекты, которые выжили некоторое время, но были отменены до достижения порога, очень эффективно очищаются от выживших.