Вычисление% времени GC на сервере Java

Я использую jstat, чтобы получить общее накопленное время для операций GC, т.е. GCT

Итак, предположим, что GCT составляет 2 секунды, а мой процесс JVM начался в течение 60 секунд, я работаю на Quad Core, поэтому мой% GC имеет

2 / 60 * 4 = 0.83%

Правильно ли мой расчет выше?

Ответ 1

Нет, ваш расчет не является точным, потому что таким образом вы не знаете точное время, в течение которого ОС позволяла вашей программе работать.

Предполагая, что вы хотите рассмотреть время, в течение которого приложение было полностью остановлено GC (время паузы), вы можете использовать следующие параметры JVM:

-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime

Эти параметры заставят JVM печатать что-то подобное в stdout:

Application time: 3.3319318 seconds
Total time for which application threads were stopped: 0.7876304 seconds
Application time: 2.1039898 seconds
Total time for which application threads were stopped: 0.4100732 seconds

Затем вы можете суммировать время, в течение которого приложение было остановлено, и разделить его на сумму времени приложения плюс время паузы, чтобы получить использование мутатора (доля времени, в течение которого приложение не было приостановлено GC).

См. также http://prefetch.net/blog/index.php/2008/02/18/measuring-the-time-an-application-was-stopped-due-to-garbage-collection/

Ответ 2

нет, не совсем. ваш расчет предполагает 100% -ное использование всех 4 ядер посредством java-процессов в течение всего времени.

правильный расчет (time spent in logic) / (time spent in gc), но для получения первой части информации обычно требуется профайлер.

Ответ 3

PrintGCDetails - эта опция может быть полезна. Он печатает информацию о каждой сборке мусора.

[GC
[PSYoungGen: 99952K->14688K(109312K)]
422212K->341136K(764672K), 0.0631991 secs]
[Times: user=0.83 sys=0.00, real=0.06 secs]

P предоставляет информацию об использовании процессора и истекшем времени. Значение для право пользователя - время процессора, используемое исполняемой сборкой мусора инструкции за пределами операционной системы. В этом примере сборщик мусора использовал 0,06 секунды времени процессора пользователя. Значение для Право sys - это время процессора, используемое операционной системой от имени сборщик мусора. В этом примере сборщик мусора не использовать любое время процессора, выполняющее инструкции операционной системы от имени сбор мусора. Значение справа от реального - прошедшее время настенных часов в секундах сбора мусора. В этом примере, для завершения сбора мусора потребовалось 0,06 секунды.

Производительность Java - хорошая книга, которую можно найти в цифровой версии. Содержит отличную статью об измерении воздействия GC.

Ответ 4

Нет, расчет неверен. То, что вы хотите вычислить,

( CPU spent on GC ) / ( total CPU spent on JVM)

Как указано в других комментариях, "общий ЦП, потраченный на JVM", будет ниже 60 * 4, так как это предполагает полную загрузку системы вашим приложением и отсутствие циклов ЦП, затраченных операционной системой или другими приложениями. В linux команды "time" и "ps" можно использовать, чтобы узнать здесь правильный номер.

Однако, также "CPU, потраченный на GC", трудно определить командой jstat. Я подозреваю, что jstat сообщает о часах разгона (а не о CPU), что будет бесполезно для вычисления выше - опять же, вы не знаете, полностью ли GC полностью загрузила все ядра во время периода времени. Удивительно, но нет четкой документации о том, какое время (wallclock vs. CPU) сообщается командой jstat - если я пропустил это, оставьте здесь комментарий.