Сообщения журнала сбора мусора Java - PullRequest
94 голосов
/ 22 мая 2009

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

У меня есть некоторые разумные догадки, но я ищу ответы, которые дают строгие определения того, что означают цифры в записях, подкрепленные достоверными источниками. Автоматический +1 ко всем ответам, которые цитируют ВС документации. Мои вопросы:

  1. На что ссылается PSYoungGen? Я предполагаю, что это как-то связано с предыдущим (младшим?) Поколением, но что именно?
  2. В чем разница между второй тройкой чисел и первой?
  3. Почему имя (PSYoungGen) указано для первого триплета чисел, а не для второго?
  4. Что означает каждое число (объем памяти) в триплете. Например, в 109884K-> 14201K (139904K) это память до GC 109884k, а затем она уменьшается до 14201K. Какое отношение имеет третий номер? Зачем нам нужен второй набор чисел?

8109.128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0,0454530 сек]

8112.111: [GC [PSYoungGen: 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0,0934560 сек]

8112.802: [GC [PSYoungGen: 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0,0682690 секунд]

Ответы [ 3 ]

126 голосов
/ 19 августа 2009
  1. PSYoungGen относится к сборщику мусора, используемому для второстепенного сбора. PS обозначает Parallel Scavenge.
  2. Первый набор чисел - это размеры молодого поколения до и после, а второй - для всей кучи. ( Диагностика проблемы сборки мусора подробности о формате)
  3. Имя указывает на генерирование и рассматриваемый коллектор, второй набор для всей кучи.

Пример связанного полного GC также показывает коллекторы, используемые для старого и постоянного поколений:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

Наконец, разбив одну строку вашего примера журнала:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107Mb используется до GC, 14Mb используется после GC, максимальный размер молодого поколения 137Mb
  • 675Mb куча, используемая до GC, 581Mb куча, используемая после GC, 1Gb максимальный размер кучи
  • незначительный сбор данных произошел 8109.128 секунд с момента запуска JVM и занял 0,04 секунд
90 голосов
/ 22 мая 2009

Большая часть этого объяснена в Руководстве по настройке ГХ (которое в любом случае было бы полезно прочитать).

Параметр командной строки -verbose:gc позволяет печатать информацию о куче и сборке мусора в каждой коллекции. Например, вот вывод из приложения большого сервера:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Здесь мы видим две второстепенные коллекции, за которыми следует одна крупная коллекция. Цифры до и после стрелки (например, 325407K->83000K от первой строки) указывают объединенный размер живых объектов до и после сборки мусора, соответственно. После незначительных коллекций размер включает некоторые объекты, которые являются мусором (больше не живы), но которые не могут быть восстановлены Эти объекты либо содержатся в постоянном поколении, либо на них ссылаются постоянные или постоянные поколения.

Следующее число в скобках (например, (776768K) снова из первой строки) - это фиксированный размер кучи: объем пространства, используемого для Java-объектов без запроса дополнительной памяти из операционной системы. Обратите внимание, что это число не включает одно из пространств оставшихся в живых, поскольку в любой момент времени может использоваться только одно, а также не включает в себя постоянное генерирование, которое содержит метаданные, используемые виртуальной машиной.

Последний элемент в строке (например, 0.2300771 secs) указывает время, необходимое для выполнения сбора; в этом случае примерно четверть секунды.

Формат основной коллекции в третьей строке аналогичен.

Формат вывода, созданного -verbose:gc, может быть изменен в будущих выпусках.

Я не уверен, почему у вас есть PSYoungGen; Вы поменяли сборщик мусора?

23 голосов
/ 22 июня 2012

Я просто хотел упомянуть, что подробный журнал GC можно получить с помощью

-XX:+PrintGCDetails 

параметр. Затем вы увидите вывод PSYoungGen или PSPermGen, как в ответе.

Также -Xloggc:gc.log, похоже, генерирует тот же вывод, что и -verbose:gc, но вы можете указать выходной файл в первом.

Пример использования:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

Для лучшей визуализации данных вы можете попробовать gcviewer (более свежую версию можно найти на github ).

Постарайтесь правильно написать параметры, я забыл "+", и мой JBoss не запустился бы без сообщения об ошибке!

...