Запросить дамп кучи java (дамп ядра) из приложения

Мне нужен способ запросить дамп кучи из приложения.

Обоснование: когда я сталкиваюсь с определенным состоянием ошибки, я хотел бы сбросить кучу, чтобы увидеть, что удерживает память.

Но я хотел бы автоматизировать это (например, когда я обнаруживаю, что произошло какое-то конкретное условие. Или когда сторожевой таймер больше не получает свои пинги. Когда какой-то тест терпит неудачу). Таким образом, мне нужен способ сбрасывать кучу из самого приложения. Кажется, я не могу найти его с материалом MX beans. Хотя MX Beans может дать очень хорошие трассировки стека с информацией о мониторе и «собственном синхронизаторе», информацией о взаимоблокировках и конфликтах, я не могу найти способ запросить дамп кучи. Есть ли такой способ? Или каким-то косвенным образом, например, как это делают эти штуки JVisualVM? И можно сказать JVM сбрасывать ядро ​​на OutOfMemoryExceptions..?


person stolsvik    schedule 30.11.2009    source источник


Ответы (2)


Если создать дамп кучи на OutOfMemoryError недостаточно, существует способ программный сброс кучи из Java-приложений, если это допустимо.

person gustafc    schedule 30.11.2009
comment
Круто, как раз то, что я искал, спасибо! Я нахожу удивительным, что я не нашел этот пост в блоге во время поиска в Google. Под sun.management явно очень весело! - person stolsvik; 30.11.2009
comment
Тем не менее, еще один комментарий (назад к идеям, опубликованным в OP): из вашей кучи дампа по ссылке OutOfMemoryError я могу прочитать: встроенный дампер кучи также можно использовать для создания моментального снимка кучи в другое время. Это делается с помощью утилиты командной строки jmap или консоли мониторинга и управления jconsole. Эти инструменты, вероятно, используют проприетарный MXBean, на который ссылается вторая ссылка? Мне кажется странным, что стандартные MX-бины не имеют этого метода dumpHeap(fileName, live). - person stolsvik; 30.11.2009
comment
Немного раздражает, да, но я предполагаю, что если бы это была стандартная функциональность, формат дампа кучи тоже должен быть стандартизирован. По крайней мере, я полагаю, что это потребует много работы и, возможно, ограничит свободу, которую поставщики имеют в своих реализациях виртуальных машин. - person gustafc; 30.11.2009
comment
Отличный ответ, именно то, что я искал сейчас - person keuleJ; 21.08.2012

Как насчет использования параметра виртуальной машины -XX:+HeapDumpOnOutOfMemoryError, чтобы сказать виртуальной машине HotSpot создать дамп кучи, когда ей не хватает памяти?

person Pascal Thivent    schedule 30.11.2009
comment
+1: единственное конкретное состояние ошибки, при котором OP может разумно знать, что что-то удерживает память, - это OutOfMemoryError; в этом случае сброс кучи в этот момент дает желаемый дамп кучи. - person Andrzej Doyle; 30.11.2009
comment
@Andrzej: Почему это единственное разумное условие ошибки? Существует множество способов понять, какова ситуация с памятью виртуальной машины изнутри, например. WeakReference, проверка счетчиков памяти Runtime и MX bean-компонентов и т.д. (до и после System.gc()) - полно. JProfiler хорош, но я хотел программное решение, отличное от JProfiler. Вот еще один парень, чья проблема мне близка: velocityreviews.com/forums/ Бьюсь об заклад, ему бы понравилось решение, которое мне здесь дали! - person stolsvik; 30.11.2009