2009-11-30 3 views
12

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

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

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

ответ

16

Если этого недостаточно для dump heap on OutOfMemoryError, есть способ, зависящий от HotSpot от programmatically dumping heap from Java applications, если это нормально.

+0

Удивительный, именно то, что я искал, спасибо! Мне кажется удивительным, что я не нашел этот пост в блоге во время моего поиска в Интернете. Под sun.management, по-видимому, очень весело! – stolsvik

+0

Еще один комментарий, хотя (вернемся к идеям, опубликованным в OP): Из вашей ссылки «Дамп-куча на OutOfMemoryError» я могу прочитать: «Встроенный кустарник может также использоваться для создания моментального снимка кучи на в других случаях. Это делается с помощью утилиты командной строки jmap или консоли управления консолью управления консолью. ". Эти инструменты затем, вероятно, используют запатентованный MXBean, на который ссылается вторая ссылка? Мне странно, что стандартные MX-beans не имеют этого метода dumpHeap (fileName, live). – stolsvik

+0

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

4

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

+0

+1: единственное «конкретное условие ошибки», в котором ОП может разумно знать, что что-то удерживает память, является OutOfMemoryError; в этом случае куча демпинга в этой точке дает желаемый дамп кучи. –

+0

@Andrzej: Почему это было бы единственным «разумным» условием ошибки? Существует множество способов понять, что происходит с памятью виртуальной машины внутри, например. WeakReference, проверка счетчиков памяти Runtime и MX beans и т. Д. (До и после System.gc()) - лодка. JProfiler пород, но я хотел программного, не-JProfiler решение. Вот еще один парень, чью проблему я могу рассказать: http://www.velocityreviews.com/forums/t275440-dump-complete-java-vm-state-as-core-dump-not-via-os-possible.html I ставка, он бы любил решение, которое мне дано здесь! – stolsvik

Смежные вопросы