Подтвердить что ты не робот

-XX: OnOutOfMemoryError = "kill -9% p" Проблема

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

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

Начало причала: НАЧАЛО Jetty Tue Apr 26 09:54:26 EDT 2011
Непризнанный вариант: -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 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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

Я считаю, что вам нужно процитировать весь вариант, например:

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

Ответ 3

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

Ответ 5

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

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

Итак, команда двойного кавычка, а значение параметра одинарное. Это не одна из форм, показанных в других ответах, так что, возможно, она сделает то, что вы хотите?

Ответ 6

Я даже попытался внедрить пространство, используя %20, но это было принято буквально. Итак, когда он получил OOM, он не сказал, что команда (со встроенным %20) не может быть найдена. Сумасшедший, я знаю, но стоило попробовать...:)

Возможно, мы должны использовать фактическое < и > как Sun docs?!: P Я попробую...:)

Ответ 7

Как вместо вызова kill запустите оболочку script, которая вызывает kill с переданным в качестве аргумента pid (у вас все равно будет пробел, но не флаг -9).

например. -XX:OnOutOfMemoryError='/path/killdash9.sh %p'

Если вам все еще не хватает места, возможно, попробуйте установить оболочку script pid, связанную с этим экземпляром Jetty? Достаточно взломать, но это может сработать.

Ответ 8

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

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

Здесь stdout в 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"

Ответ 10

Следующие работы

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

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

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