Как захватить дампы кучи Java? — 7 вариантов
Дампы кучи являются жизненно важными артефактами для диагностики проблем, связанных с памятью, таких как медленные утечки памяти, проблемы со сборкой мусора и java.lang.OutOfMemoryError. Они также являются жизненно важными артефактами для оптимизации потребления памяти.
Существуют отличные инструменты, такие как Eclipse MAT и Куча Герой для анализа дампов кучи. Однако вам необходимо предоставить этим инструментам дампы кучи, захваченные в правильном формате и в правильный момент времени.
В этой статье представлены несколько вариантов захвата дампов кучи. Однако, на мой взгляд, первые 3 являются эффективными вариантами, а остальные — хорошими вариантами, о которых следует знать.
1. карта
jmap печатает дамп кучи в указанное местоположение файла. Этот инструмент упакован в JDK. Его можно найти в папке \bin.
Вот как вы должны вызывать jmap:
jmap -dump:format=b,file=<file-path> <pid>
where
pid: is the Java Process Id, whose heap dump should be captured
file-path: is the file path where heap dump will be written in to.
Пример:
1 jmap -dump:format=b,file=/opt/tmp/heapdump.bin 37320
Примечание: Очень важно пройти «живую» опцию. Если этот параметр передан, то в файл дампа кучи записываются только живые объекты в памяти. Если этот параметр не указан, все объекты, даже готовые к сборке мусора, печатаются в файле дампа кучи. Это значительно увеличит размер файла дампа кучи. Это также сделает анализ утомительным. Для устранения проблем с памятью или оптимизации памяти достаточно «живой» опции.
2. HeapDumpOnOutOfMemoryError
Когда приложение сталкивается с ошибкой java.lang.OutOfMemoryError, идеально сразу же захватить дамп кучи, чтобы диагностировать проблему, потому что вы хотите знать, какие объекты находились в памяти и какой процент памяти они занимали, когда возникла ошибка java.lang.OutOfMemoryError. Однако из-за сгоряча в большинстве случаев команда ИТ/эксплуатации забывает захватить дамп кучи. Мало того, они еще и перезапускают приложение. Чрезвычайно сложно диагностировать какие-либо проблемы с памятью без своевременного захвата дампов кучи.
Вот где этот вариант очень удобен. Когда вы передаете системное свойство ‘-XX:+HeapDumpOnOutOfMemoryError’ во время запуска приложения, JVM будет захватывать дампы кучи прямо в тот момент, когда JVM испытывает OutOfMemoryError.
Пример использования:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tmp/heapdump.bin
Примечание: Захваченный дамп кучи будет напечатан в месте, указанном системным свойством «-XX:HeapDumpPath».
Лучшая практика: Всегда держите это свойство настроенным во всех приложениях, так как вы никогда не знаете, когда произойдет ошибка OutOfMemoryError.jcmd3.
3. джкмд
Инструмент jcmd используется для отправки запросов диагностических команд на JVM. Он упакован как часть JDK. Его можно найти в папке \bin.
Вот как вы должны вызывать jcmd:
jcmd <pid> GC.heap_dump <file-path>
where
pid: is the Java Process Id, whose heap dump should be captured
file-path: is the file path where heap dump will be written in to.
Пример:
1 jcmd 37320 GC.heap_dump /opt/tmp/heapdump.bin
4. JVisualVM
JVisualVM — это средство мониторинга и устранения неполадок, упакованное в JDK. Когда вы запускаете этот инструмент, вы можете увидеть все процессы Java, которые выполняются на локальном компьютере. Вы также можете подключиться к процессу Java, работающему на удаленной машине, с помощью этого инструмента.
Шаги:
1. Запустите jvisualvm в папке \bin\
2. Щелкните правой кнопкой мыши один из процессов Java.
3. Нажмите «Дамп кучи» в раскрывающемся меню.
4. Будет создан дамп кучи
5. Путь к файлу, в котором создается дамп кучи, будет указан на вкладке «Сводка» > «Основная информация» > в разделе «Файл».
Рис. Захват дампа кучи из JVisualVM
5. ДжМХ
Eсть com.sun.management:type=HotSpotDiagnostic MBean. Этот MBean имеет операцию ‘dumpHeap’. Вызов этой операции захватит дамп кучи. Операция dumpHeap принимает два входных параметра:
outputFile: путь к файлу, куда должен быть записан дамп кучи
live: при передаче «true» захватываются только живые объекты в куче
Вы можете использовать клиенты JMX, такие как JConsole, jmxshJava Mission Control, чтобы вызвать эту операцию MBean.
Рис. Использование Java Mission Control в качестве клиента JMX для создания дампа кучи
6. Программный подход
Вместо использования инструментов вы также можете программно захватывать дампы кучи из приложения. Могут быть случаи, когда вы хотите захватить дампы кучи на основе определенных событий в приложении. Вот хорошая статья от Оракла который предоставляет исходный код для захвата дампов кучи из приложения путем вызова JMX-компонента com.sun.management:type=HotSpotDiagnostic MBean, который мы обсуждали в описанном выше подходе.
7. Административная консоль IBM
Если ваше приложение работает на сервере приложений IBM Websphere, вы можете использовать административную консоль для создания куч.
Шаги:
1.Запустите административную консоль
2. На панели навигации щелкните Устранение неполадок > Дампы и ядра Java.
3. Выберите server_name, для которого вы хотите создать дамп кучи.
4. Щелкните Дамп кучи, чтобы создать дамп кучи для указанного сервера.
Вы также можете использовать wsadmin для создания дампов кучи.