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

9

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

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

karlcyr
источник
4
Я выдвигаю этот вопрос как «наиболее непреднамеренно звучащий».
Феб
1
Ха ... Я думал о том, чтобы сделать это намеренно отвратительно звучащим, но я новичок здесь, и я не был уверен, как сообщество воспримет это :).
karlcyr

Ответы:

7

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

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

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

fglez
источник
попробовал это с GDB на Linux, и он прекрасно работает.
Кристиан
какой JDK имеет "gcore"? у меня Sun 32 bit jdk для linux 1.6.0.20 его не имеет.
Джангофан
Отредактировано с уточнением gcore.
fglez
2

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

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

Rytis
источник
2

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

Кристиан
источник
Спасибо, Кристиан, может ли jmap быть более надежным до появления ошибки?
karlcyr
Jmap все еще потребуется время, чтобы получить дамп кучи. но вы получите полный heapdump, если ваш jvm / tomcat несет за это большую ответственность.
Кристиан
Я думаю, что самый чистый и простой инструмент для этого - «Visual VM». Это может быть вне области применения, но создание собственного плагина для VisualVM, который обнаруживает условие и принимает автоматический дамп из VisualVm, было бы потрясающим ИМХО.
Джангофан
2

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

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

karlcyr
источник
2

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

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

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

Ник Христов
источник