Есть ли способ получить функциональность, подобную Dominator Tree, из работающей JVM?

Недавно я копался в дампах кучи JVM, используя Eclipse MAT. Мне это нравится, но больше всего я использую функцию Дерево доминаторов. Пример скриншота Eclipse:

Пример скриншота дерева Eclipse Dominator

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

  1. Создать дамп кучи (jcmd <pid> GC.heap_dump)
  2. Загрузите/извлеките дамп кучи в определенное место (MAT не установлен на наших серверах)
  3. Запустите инструмент Eclipse MAT ParseHeapDump.sh для построения различных деревьев.
  4. Откройте MAT, щелкните значок Dominator Tree.
  5. Анализировать

Есть ли способ получить эту эквивалентную информацию от работающей JVM программным путем? Я хотел бы запустить какой-нибудь скрипт gather_dominators.sh <pid> на хосте и получить Top X Objects из JVM, но я не знаю, с чего начать.


person Nick Klauer    schedule 06.08.2015    source источник
comment
Вы смотрели на источник банок, используемых ParseHeapDump.sh?   -  person the8472    schedule 06.08.2015


Ответы (1)


Если под "запуск jvm" вы имели в виду - "получение информации без создания динамического дампа стоп-мира", то очевидный ответ: в чтобы сделать это без «полного сканирования» - данные необходимо собирать на протяжении всего жизненного цикла системы, касаясь создания/выпуска каждого объекта и ведя статистику. Вы можете добиться таких вещей с помощью инструментов или с помощью готовых пользовательских агентов (jol/jamm/etc). Обратите внимание, что многие GC уже выполняют аналогичную работу по сбору (и печати) статистики. IIRC - более новые JVM даже отслеживают такую ​​​​информацию в области метаданных класса (поэтому получение статистики происходит мгновенно).


С другой стороны, если вы можете получить дамп кучи (который должен подойти для любой производственной системы с любой надлежащей избыточностью узлов, предназначенный для обработки неизбежных остановок Sun-JVM). GC делает паузу), то Jhat, MAT-api, YourKit и Jol, вероятно, Ваши лучшие друзья:

Важно отметить, что существующий в настоящее время формат динамического дампа теряет информацию о фактических размерах объектов, поэтому все инструменты (MAT/и т. д.) просто пытаются УГАДАТЬ это должным образом:

ХТХ :)

person Vlad    schedule 07.08.2015