Каков наилучший способ измерения времени паузы ГХ? - PullRequest
0 голосов
/ 17 мая 2018

Каков наилучший способ отслеживания времени приостановки / остановки GC в экземпляре Java?

  1. можно ли его получить из сборщика мусора GarbageCollectorMXBean ?
  2. это можно прочитать из gc.log?

Есть ли у gc.log какая-либо дополнительная информация, которой нет у MXBean? Я бы предпочел вариант 1, потому что я хочу, чтобы экземпляр отправлял этот показатель в нашу систему мониторинга.

Я прочитал несколько сообщений, таких как this на SO, но, похоже, я не получаю правильного ответа. Я специально ищу время остановки ГХ и , а не общее время, проведенное на ГХ.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Сборка мусора - не единственная причина, по которой JVM останавливает мир.
Вы можете посчитать и другие причины тоже.

Первый способ контроля пауз безопасной точки - это анализ журналов виртуальной машины:

  • для JDK 8 и более ранних версий добавить опцию -XX:+PrintGCApplicationStoppedTime JVM;
  • начиная с JDK 9 добавить -Xlog:safepoint.

Затем найдите Total time for which application threads were stopped сообщений в файле журнала.

Второй способ - использовать недокументированный Hotspot внутренний MXBean:

sun.management.HotspotRuntimeMBean runtime =
        sun.management.ManagementFactoryHelper.getHotspotRuntimeMBean();

System.out.println("Safepoint time:  " + runtime.getTotalSafepointTime() + " ms");
System.out.println("Safepoint count: " + runtime.getSafepointCount());

Это дает вам суммарное время всех пауз JVM. См. Обсуждение в этот ответ .

0 голосов
/ 17 мая 2018

Я специально ищу время остановки ГК

Есть больше времени для остановки, чем сам GC. Время для получения безопасной точки также является остановкой приложения и доступна только для регистрации части, а не через MXBeans

Но на самом деле, если вас беспокоит остановка приложений, то ни GC-паузы, ни превышение безопасного времени не являются тем, что вы должны измерить . Вы должны измерить сами киоски, например через jhiccup

...