Я пытаюсь захватить полные GC, которые встречаются в нашем приложении Java. До сих пор у меня есть два подхода, как с недостатками:Программный захват полного количества GC
- опрашивать GarbageCollectorMXBean Объекты каждые х секунд, затем потянуть время GC и количество GC с момента последнего опроса и попытаться обнаружить, как долго произошло GC. К сожалению, с этим мы не знаем, является ли это Full GC.
- Используйте javax.management.NotificationListener, подписаться на уведомления GarbageCollectorMXBean. Теоретически приложение будет уведомляться, когда происходит GC, с текстом «конец основного GC» и «конец младшего GC», а также причина. Недостатком такого подхода является то, что продолжительность кажется дико неправильной (иногда показывая 898 секунд, когда журнал GC покажет .2 секунды), и есть таинственный случай «Нет GC», который, по-видимому, указывает, что GC не был фактически выполнен (как в журнале gc не было записи).
Гибридный подход возможен, когда GC MXBeans может быть запрошен, когда я получаю уведомление GC, а затем проверьте, был ли GC выполнен. Недостатком этого является то, что причина отсутствия GC может по-прежнему запускаться в конце «основного GC» и вызывать сложность логики.
То, что я действительно получаю, - это общая сумма времени, в течение которого приложение было приостановлено из-за операций GC. Я полагаю, что захват полной GC будет достаточным, чтобы указать, что приложение остановилось в течение определенного периода времени, так что, если мы обнаружим частые GC, мы знаем, что это тяжелое использование или у приложения скоро закончится память. Есть ли лучшее решение для определения времени GC и есть ли полный GC?
Редактировать: Чтобы быть ясным, я хотел бы зафиксировать эту информацию внутри данной JVM. Эта JVM контролируется отдельной командой, и мы не нуждаемся в контроле над аргументами JVM, которые они задают, мы можем давать рекомендации. Идея аналогична полетному самописцу, но вместо этого предоставляет информацию в режиме реального времени администраторам.
Оба они обычно возвращаются с java.lang.management.ManagementFactory.getGarbageCollectorMXBeans(), верно? – btz
@btz Я думаю, да. – eckes
Это в конечном итоге приблизило меня к цели, я в конечном итоге ожидал уведомления GC от сборщиков мусора, после того как я получил уведомление о событии GC, я бы проанализировал предыдущие значения общего времени и общее количество GC для определить среднее время с момента последнего уведомления. Это позволит мне получить причину, имя GC и эффективное время GC. – btz