Моя команда сталкивается с трудностями при попытке получить хорошие дампы кучи, вызванные OutOfMemoryErrors. По определенным причинам мы в настоящее время принимаем дампы с помощью jmap, вызываемого из сценария bash, вместо использования флага HeapDumpOnOutOfMemoryError. Мы используем 64-битную 1.6 JVM с размером кучи около 3 ГБ. Наши дампы кучи терпят неудачу в 90% случаев (догадываюсь).
Есть ли что-нибудь, что мы можем сделать, чтобы улучшить наши шансы на получение чистого дампа кучи, который мы можем использовать для устранения проблем с памятью? Я читал, что у jmap были серьезные проблемы в Java 1.4, но эти проблемы должны быть решены в основном сейчас.
java
oom
outofmemoryerror
dump
karlcyr
источник
источник
Ответы:
Какая у вас операционная система? (Я не могу добавлять комментарии).
Для Solaris мы получаем лучшие результаты, сначала форсируя дамп ядра (
gcore <pid>
), а затем присоединяя jmap к файлу дампа ядра (jmap -heap:format=b <path to java bin> <path to core>
)gcore
утилита * nix для генерации образа работающей программы Смотрите ссылку .источник
у нас есть JSP, который запрашивает ManagementFactory.getThreadMXBean () и создает отчет. Может быть бесполезно, когда приложение зависало, но если вы будете опрашивать каждую минуту или около того, вы получите представление о том, что происходит.
Больше информации здесь.
источник
Вы можете контролировать свое приложение через jmx извне. когда вы знаете некоторые метрики, которые указывают на предстоящий OutOfMemory, вы можете запустить jmap до того, как будет сгенерировано исключение.
источник
Спасибо всем за ваши предложения.
В итоге мы написали скрипт для активного мониторинга журналов сборки мусора. По нашему опыту, полная GC почти всегда предшествует OOM, поэтому наш сценарий обнаруживает это событие, изящно удаляет сервер из пула балансировки нагрузки и запускает дамп кучи. Это значительно повысило нашу эффективность.
источник
Это довольно старый вопрос, но я поставлю ответ с надеждой, что кто-то может найти это полезным.
Jmap имеет опцию -F (сила). В прошлом это оказалось не очень хорошо для меня. Если вы хотите использовать опцию -F, я бы порекомендовал вам также указать каталог java.io.tmp как часть команды jmap. В JVM версии 1.6.22 возникла проблема, из-за которой утилита jmap не работала должным образом из-за настройки временного каталога.
Вы также можете попытаться получить дамп ядра через GDB. Если у вас есть ядро, jmap может конвертировать ядро в дамп кучи.
источник