Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

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

Также можно попробовать сделать дамп ядра через gdb. Когда у вас есть ядро, jmap может преобразовать его в дамп кучи.