#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 предпочтительнее для такого рода опций, поскольку их не нужно применять к процессу завершения работы.