Как надежно взять Java Heap Dump?

Моя команда сталкивается с трудностями при попытке получить хорошие дампы кучи, вызванные OutOfMemoryErrors. По определенным причинам мы в настоящее время принимаем дампы с помощью jmap, вызываемого из сценария bash, вместо использования флага HeapDumpOnOutOfMemoryError. Мы используем 64-битную 1.6 JVM с размером кучи около 3 ГБ. Наши дампы кучи терпят неудачу в 90% случаев (догадываюсь).

Что мы можем сделать, чтобы улучшить наши шансы получить чистый дамп кучи, который мы можем использовать для устранения проблем с памятью? Я читал, что у jmap были серьезные проблемы в Java 1.4, но эти проблемы должны быть решены в основном сейчас.

5 ответов

Какая у вас операционная система? (Я не могу добавлять комментарии).

Для Solaris мы получаем лучшие результаты, сначала форсируя дамп ядра (gcore <pid>) и затем присоединение jmap к файлу дампа ядра (jmap -heap:format=b <path to java bin> <path to core>)

gcore утилита *nix для генерации образа работающей программы Смотрите ссылку.

Спасибо всем за ваши предложения.

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

Это довольно старый вопрос, но я поставлю ответ с надеждой, что кто-то может найти это полезным.

Jmap имеет опцию -F (сила). В прошлом это оказалось не очень хорошо для меня. Если вы хотите использовать опцию -F, я бы порекомендовал вам также указать каталог java.io.tmp как часть команды jmap. В JVM версии 1.6.22 возникла проблема, из-за которой утилита jmap не работала должным образом из-за настройки временного каталога.

Вы также можете попробовать получить дамп ядра через gdb. Если у вас есть ядро, jmap может конвертировать ядро ​​в дамп кучи.

Вы можете контролировать свое приложение через jmx извне. когда вы знаете некоторые метрики, которые указывают на предстоящий OutOfMemory, вы можете запустить jmap до того, как будет сгенерировано исключение.

У нас есть JSP, который запрашивает ManagementFactory.getThreadMXBean() и создает отчет. Может быть бесполезно, когда приложение зависало, но если вы будете опрашивать каждую минуту или около того, вы получите представление о том, что происходит.

Больше информации здесь.

Другие вопросы по тегам