-XX: OnOutOfMemoryError = "kill -9% p" Проблема - PullRequest
29 голосов
/ 26 апреля 2011

У меня проблема с попыткой передать команду -XX:OnOutOfMemoryError="kill -9 %p" в мои аргументы jvm.

Я использую Jetty7, и это в файле start.ini. При запуске это даст мне ошибку ниже. Это с jre /jre1.6.0_03l64

Стартовая пристань Нераспознанная опция: -9
Не удалось создать виртуальную машину Java.

Файл start.ini показан ниже.

#===========================================================
# If the arguements in this file include JVM arguments
# (eg -Xmx512m) or JVM System properties (eg com.sun.???),
# then these will not take affect unless the --exec
# parameter is included or if the output from --dry-run
# is executed like:
#   eval $(java -jar start.jar --dry-run)
#
# Below are some recommended options for Sun's JRE
#-----------------------------------------------------------
  --exec
# -Dcom.sun.management.jmxremote
  -Xmx4096m
  -Xmn512m
  -DLABEL=PROD_APP
  -verbose:gc
  -Xloggc:/export/opt/prod_app/logs/gc.log
  -XX:OnOutOfMemoryError="kill -9 %p"
# -XX:+PrintGCDateStamps
  -XX:+PrintGCTimeStamps
  -XX:+PrintGCDetails
  -XX:+PrintTenuringDistribution
# -XX:+PrintCommandLineFlags
# -XX:+DisableExplicitGC
# -XX:+UseConcMarkSweepGC
# -XX:ParallelCMSThreads=2
# -XX:+CMSClassUnloadingEnabled
# -XX:+UseCMSCompactAtFullCollection
# -XX:CMSInitiatingOccupancyFraction=80

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

Кто-нибудь может понять, что я делаю здесь неправильно или как я могу это исправить?

Ответы [ 13 ]

18 голосов
/ 24 ноября 2016

В версии Java 8u92 были добавлены аргументы VM

  • -XX:+ExitOnOutOfMemoryError
  • -XX:+CrashOnOutOfMemoryError

, см. Примечания к выпуску .

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

CrashOnOutOfMemoryError
Если эта опция включена, то при возникновении ошибки нехватки памяти JVM дает сбой и создает текстовые и двоичные файлы сбоя.

Запрос на улучшение: JDK-8138745 (хотя имя параметра неверно JDK-8154713 , ExitOnOutOfMemoryError вместо ExitOnOutOfMemory)

3 голосов
/ 10 июня 2013

Версия с одинарными кавычками теперь должна нормально работать в Jetty> 9.0.4.

https://bugs.eclipse.org/bugs/show_bug.cgi?id=408904

3 голосов
/ 21 июня 2015

Я столкнулся с этой проблемой совсем недавно.Я решил это, установив параметр в переменную окружения JAVA_TOOL_OPTIONS.Эта переменная задокументирована Oracle , и вы должны export эту переменную в своих командах оболочки, и JVM добавит ее к аргументам.

3 голосов
/ 24 мая 2013

Запуск как опция hadoop Я сталкиваюсь с теми же проблемами. Это был ответ:

-XX:OnOutOfMemoryError='kill -9 %p'

Вот стандартный вывод OOM:

#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing /bin/sh -c "kill -9 11902"...

Я тоже пробовал:

-XX:OnOutOfMemoryError='"kill -9 %p"'

Это началось, но на OOM это

# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill' '-9' '%p"
#   Executing /bin/sh -c "kill' '-9' '1164"...

Но STDERR имеет: sh: kill -9 1164: команда не найдена

Это даже не началось бы:

'-XX:OnOutOfMemoryError=kill -9 %p'
"-XX:OnOutOfMemoryError=kill -9 %p"
-XX:OnOutOfMemoryError="kill -9 %p"
3 голосов
/ 27 апреля 2011

Полагаю, вам нужно процитировать весь вариант, например:

  "-XX:OnOutOfMemoryError=kill -9 %p"
1 голос
/ 24 марта 2017

следующих работ

java -classpath $CLASSPATH "-XX:OnOutOfMemoryError=touch 'worker.oome'"  $JVM_ARGS $MAIN

Большинство предоставленных ответов не работают.

Однако .. если вы хотите поместить его, например, в переменная $ JVM_ARGS, в которой вы находитесь, для мира боли.

1 голос
/ 18 февраля 2013

Я нашел эту опцию в скрипте и хотел узнать больше об этом, и Google привел меня сюда. В рассматриваемом сценарии опция указана как

-XX:OnOutOfMemoryError='"kill -9 %p"'

Таким образом, команда заключена в двойные кавычки, а значение параметра - в одинарные кавычки. Это не одна из форм, показанных в других ответах, так что, возможно, она будет делать то, что вы хотите?

0 голосов
/ 14 марта 2019

правильный синтаксис - экранирование кавычек (")

-XX:OnOutOfMemoryError=\"kill -9 %p\"
0 голосов
/ 07 апреля 2018

В документации Oracle OnOutOfMemoryError имеет подпись:

-XX:OnOutOfMemoryError="<cmd args>; <cmd args>"

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

Так в приведенном примере должно быть:

-XX:OnOutOfMemoryError="kill;-9;%p"
0 голосов
/ 23 марта 2018

Вам нужно использовать -XX:OnOutOfMemoryError=/bin/kill -9 %p

Также, если вы хотите проверить изменения, вы можете отобразить сообщение перед тем, как убить его.

-XX:OnOutOfMemoryError=/bin/date; /bin/echo custom message;/bin/kill -9 %p

...