Установите JVM для сброса кучи при сбросе OutOfMemoryError

#java #jakarta-ee

#java #джакарта-ee

Вопрос:

Я пытаюсь настроить JVM сервера, над которым я работаю, так, чтобы он сбрасывал кучу в файл при возникновении OOME.

Я знаю, что должен где-то добавить эту опцию -XX:-HeapDumpOnOutOfMemoryError к аргументам JVM, но я не могу понять, как это сделать.

К вашему сведению, я могу получить доступ к серверу через PuTTY, поэтому я ищу способ сделать это из командной строки.

JVM, которую я использую, является 64-разрядной виртуальной машиной сервера OpenJDK.

Я не знаю, имеет ли это значение, но приложение представляет собой файл war.

 PS : ps -ef|grep java

tomcat   23837     1  0 Mar25 ?        00:03:46 /usr/lib/jvm/jre/bin/java -classpath :/usr/share/tomcat6/bin/bootstrap.jar:/usr/share/tomcat6/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat6 -Dcatalina.home=/usr/share/tomcat6 -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat6/temp -Djava.util.logging.config.file=/usr/share/tomcat6/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
  

Редактировать :

Я кое-что нашел, поправьте меня, если я ошибаюсь: поскольку я использую Tomcat, я решил добавить эти строки в файл tomcat.conf:

JAVA_OPTS=-XX:-HeapDumpOnOutOfMemoryError

JAVA_OPTS=-XX:HeapDumpPath=/root/дамп

JAVA_OPTS=-Xmx20m

Что вы думаете?

Ответ №1:

Этот параметр из параметров виртуальной машины HotSpot. Я бы подумал, что в виртуальной машине OpenJDK будет то же самое, но дайте мне знать, если это не так.

-XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>

Вы также можете вручную сгенерировать карту памяти с помощью jmap, если вам известен идентификатор процесса:

jmap -J-d64 -dump:format=b,file=<path to dump file> <jvm pid>

Вы можете использовать JHat для анализа дампа.

jhat <path to dump file>

Комментарии:

1. Спасибо за ответ. Вы имеете в виду, что я должен это сделать: java -XX: HeapDumpOnOutOfMemoryError whatever.war ?

2. Кстати, это параметры JVM, если это не было очевидно.

3. Только @l0r3nz4cc10 может принять ответ (в качестве исходного текста вопроса). Спасибо за редактирование синтаксиса 🙂

4. Возможным (гибридным) решением является запуск команды jmap из самого java-процесса с использованием -XX:OnOutOfMemoryError=<command>. (Возможно, даже лучше обернуть команду в скрипт, который также позаботится о поиске правильного pid)

Ответ №2:

Как упоминалось @CoolBeans, используемые параметры JVM следующие:

 -XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>
  

Для настройки этого параметра в tomcat создайте файл с именем setenv.sh (setenv.bat для Windows) в каталоге TOMCAT_HOME /bin и добавьте следующую строку

 export CATALINA_OPTS="$CATALINA_OPTS -XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>"
  

CATALINA_OPTS предпочтительнее для такого рода опций, поскольку их не нужно применять к процессу завершения работы.