2009-05-21 4 views
90

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

У меня есть некоторые разумные догадки, но я ищу ответы, которые содержат строгие определения того, что означают цифры в записях, подкрепленные достоверными источниками. Автоматический +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 сек]

+0

вся куча, часть молодого поколения кучи, незначительный gc для того, как работает gc, проверьте, например. Http: //www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ – MarianP

ответ

83

Большая часть из них объясняется в GC Tuning Guide (что вам все равно будет полезно прочитать).

Опция командной строки -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; вы изменили сборщик мусора?

+0

Где найти файлы журнала gc? – janwen

+5

Этот ответ действительно не затрагивает исходные вопросы. Я считаю, что ответ Майклайосефа лучше. Он затрагивает вопросы, заданные Этаном, и делает лучшую работу по разрушению оригинального примера. Хотя в его ответе есть два вопроса (его связь теперь мертва, а rafa.ferreria указала на другую), это не просто срывает Oracle-документ. – Dirk

116
  1. PSYoungGen относится к сборщику мусора, используемому для мелкой коллекции. PS означает Parallel Scavenge.
  2. Первый набор чисел - это размеры до и после молодого поколения, а второй набор - для всей кучи. (Diagnosing a Garbage Collection problem подробнее формат)
  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, max yo Ун размер поколение 137Mb
  • 675Mb кучи использовали до GC, 581Mb кучи используется после того, как GC, 1Gb максимальный размер кучи
  • незначительные ГХ произошло 8109,128 секунд с момента начала JVM и принял 0.04 секунды
+8

только незначительный комментарий, значение между '()' не является максимальным размером, навсегда, является максимальным размером на данный момент. Если GC не может освободить кучу меньше, то этот предел потребует больше пространства для операционной системы, и это значение будет увеличиваться. Уважая, конечно, ограничение, определенное на: -Xmx –

+0

@ rafa.ferreira Я думаю, что значение в paranthesis, то есть 1119040K, является фиксированным размером кучи. Я не думаю, что GC печатает размер «максимальной кучи» в любом месте. [Ссылка 1] (http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html) и [Ссылка 2] (http://docs.oracle.com/javase/7 /docs/api/java/lang/management/MemoryUsage.html) – rohitmohta

22

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

-XX:+PrintGCDetails 

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

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

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

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

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

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

+2

Более современный GCViewer: https://github.com/chewiebug/GCViewer/wiki – cwash

+2

Обратите внимание, что gc.log будет перезаписан при перезапуске java (например, если вы перезапустите свой tomcat, потому что у него были проблемы с памятью, и вам было бы приятно увидеть этот gc.log). Или, по крайней мере, это произойдет, если вы повернете журналы GC. Существует множество других опций, управляющих журналом gc. См. Http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html. В частности, рассмотрим '-XX: + PrintGCDateStamps -XX: + PrintGCTimeStamps -XX: + UseGCLogFileRotation -XX: NumberOfGCLogFiles = <некоторое количество файлов> -XX: GCLogFileSize = -XX: + PrintTenuringDistribution' –