Java gc - что такое долгоживущий объект?

Мне сказали не создавать слишком много долгоживущих объектов, чтобы получить лучшую производительность gc. Потому что долгоживущие объекты будут перенесены в старое поколение. И собирать предметы в старом поколении дороже.

Но что значит долгоживущий? 100 миллисекунд это слишком долго? А как насчет 10 секунд?

Мое приложение занимает кучи памяти 15 ГБ и использует G1 GC, я не могу найти какую-то конфигурацию, например, "как долго переместить объект в старое поколение"

2 ответа

Решение

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

Сначала GC, живые объекты перемещаются в пространство выживших из нового поколения. Затем, после нескольких gcs, они остаются в старом пространстве.

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

На каждом GC JVM определяет количество раз, которое объект может быть скопирован до того, как он был заслужен, называется порог владения. Этот порог выбран таким образом, чтобы пространство для выживших наполовину было заполнено.

Если вы хотите иметь больше контроля, вы можете использовать параметр JVM XX:MaxTenuringThreshold

Порог владения - это количество раз, которое объект может пережить коллекцию молодого поколения, прежде чем перейти в старое поколение. Это может быть настроено с этими параметрами:

  • -XX:InitialTenuringThreshold: начальный порог владения (по умолчанию 7).
  • -XX: MaxTenuringThreshold: максимальный порог владения (по умолчанию 15 для параллельного коллектора и 4 для CMS).
  • -XX: -PrintTenuringDistribution: печать информации о возрасте владения.
Другие вопросы по тегам