Статьи

7 опций для захвата дампов кучи Java

Дампы кучи являются жизненно важными артефактами для диагностики проблем, связанных с памятью, таких как медленные утечки памяти, проблемы сбора мусора и java.lang.OutOfMemoryError. Они также являются жизненно важными артефактами для оптимизации потребления памяти.

Есть отличные инструменты, такие как Eclipse MAT и Heap Hero для анализа дампов кучи. Однако вам необходимо предоставить этим инструментам дампы кучи, записанные в правильном формате и правильном моменте времени.

Эта статья дает вам несколько вариантов захвата дампов кучи. Однако, по моему мнению, первые 3 являются эффективными вариантами использования, а другие являются хорошими вариантами, о которых следует знать.

1. Jmap

Jmap печати кучи дампов в указанном месте файла. Этот инструмент упакован в JDK. Его можно найти в папке bin .

Вот как вы должны вызвать jmap:

1
2
3
4
5
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.

Пример использования:

1
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tmp/heapdump.bin

Примечание. Захваченный дамп кучи будет напечатан в месте, указанном системным свойством ‘-XX: HeapDumpPath’.

Рекомендация: всегда сохраняйте это свойство настроенным во всех приложениях, поскольку вы никогда не знаете, когда произойдет OutOfMemoryError.jcmd3.

3. JCMD

Инструмент jcmd используется для отправки запросов диагностических команд в JVM. Он упакован как часть JDK. Его можно найти в папке bin .

Вот как вы должны вызывать jcmd:

1
2
3
4
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. JMX

Существует com.sun.management:type=HotSpotDiagnostic MBean . Этот MBean имеет операцию «dumpHeap». Вызов этой операции захватит дамп кучи. Операция dumpHeap принимает два входных параметра:

  1. outputFile: путь к файлу, в который должен быть записан дамп кучи
  2. live: когда передается значение true, захватываются только живые объекты в куче

Вы можете использовать JMX-клиенты, такие как JConsole, jmxsh , Java Mission Control, чтобы вызвать эту операцию MBean.

Рис. Использование Java Mission Control в качестве клиента JMX для генерации дампа кучи

6. Программный подход

Вместо использования инструментов вы также можете программно захватывать дампы кучи из приложения. Могут быть случаи, когда вы хотите захватить дампы кучи на основе определенных событий в приложении. Вот хорошая статья от Oracle, в которой приведен исходный код для захвата дампов кучи из приложения с помощью вызова bean-компонента JMX MBean com.sun.management:type=HotSpotDiagnostic , который мы обсуждали в приведенном выше подходе.

7. Административная консоль IBM

Если ваше приложение работает на IBM Websphere Application Server, вы можете использовать административную консоль для генерации куч.

шаги:

  1. Запустить административную консоль
  2. На панели навигации выберите Устранение неполадок> Дампы и ядра Java.
  3. Выберите имя_сервера, для которого вы хотите создать дамп кучи
  4. Нажмите Дамп кучи, чтобы создать дамп кучи для указанного сервера.

Вы также можете использовать wsadmin для создания дампов кучи.

Смотрите оригинальную статью здесь: 7 опций для захвата дампов кучи Java

Мнения, высказанные участниками Java Code Geeks, являются их собственными.