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

31

我在尝试将-XX:OnOutOfMemoryError="kill -9 %p"命令传递到我的JVM参数时遇到了问题。

我正在使用Jetty7,并且将其放在start.ini文件中。启动时会给我下面的错误。这是使用jre / jre1.6.0_03l64时出现的错误:

Starting Jetty: STARTED Jetty Tue Apr 26 09:54:26 EDT 2011
Unrecognized option: -9
Could not create the Java virtual machine.

以下是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

如果注释掉这一行,jetty可以正常启动而没有任何问题。然而,由于系统存在内存泄漏的问题,我们确实需要添加此参数以防止进一步损害,如果我们的进程失败。

请问有人知道我在这里做错了什么,或者我如何解决这个问题吗?


我也遇到了类似的问题,但是这是在我的批处理/ bash 文件中。也许jetty在.ini文件中将所有内容都加上了引号。你可以尝试使用单引号(')代替双引号(")? - Wim Deblauwe
我不知道为什么它不起作用... 它说 -XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 当首次抛出 OutOfMemoryError 时运行用户定义的命令。 (在1.4.2更新12、6中引入) http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html - eee
12个回答

28
在Java 8u92版本中添加了VM参数:
  • -XX:+ExitOnOutOfMemoryError
  • -XX:+CrashOnOutOfMemoryError
,详见发布说明

ExitOnOutOfMemoryError
启用此选项后,JVM在首次发生内存溢出错误时退出。如果您更喜欢重新启动JVM实例而不是处理内存溢出错误,则可以使用此选项。

CrashOnOutOfMemoryError
如果启用此选项,则当发生内存溢出错误时,JVM会崩溃并生成文本和二进制崩溃文件。

增强要求:JDK-8138745(但参数命名错误,参见ExitOnOutOfMemoryErrorExitOnOutOfMemory)。

4

作为Hadoop选项运行时,我遇到了相同的问题。 这是答案:

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

以下是内存溢出时的标准输出:

#
# 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"

我在这里开了一个错误报告:https://bugs.eclipse.org/bugs/show_bug.cgi?id=408904这个问题应该在几年前就被报告为一个错误,我们本可以更早地解决它。 - jesse mcconnell
3
错误 sh: kill -9 1164: command not found 告诉您重要信息,即传递给 sh 的可执行文件是 kill -9 1164(请注意,这是它试图运行的可执行文件的名称)。证明:如果您现在在命令行中键入类似 $ blargfish -9 1164 的内容,您会得到 blarghfish: command not found。请注意,命令行参数不包含在错误消息中。 - Joakim Erdfelt

4

我最近遇到了这个问题。我通过将选项设置为JAVA_TOOL_OPTIONS环境变量来解决它。这个变量在Oracle文档中有记录,你必须在shell命令中export这个变量,JVM会将其附加到参数中。


4

3

我认为您需要引用整个选项,像这样:

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

如果我在整个选项周围加上引号,那么它就不会出现在实际的进程参数中,我本来希望在这里看到它。虽然它确实启动了,这是积极的。//1526 1506 99 04:51 pts/2 00:00:05 /usr/java/jre1.6.0_03l64/bin/java -Xmx4096m -Xmn512m -verbose:gc -Xloggc:/export/opt/atdirect_dev/logs/gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -Djetty.home=/export/opt/PROD_APP –Dprod_app.connection-client.cfg=/export/opt/PROD_APP/lib/PROD/prod.connection-client.cfg -DLABEL=PROD_APP - Patrick

3
你需要使用-XX:OnOutOfMemoryError=/bin/kill -9 %p。 此外,如果你想要测试这些更改,你可以在杀死进程之前发出一条消息。 -XX:OnOutOfMemoryError=/bin/date; /bin/echo 自定义消息; /bin/kill -9 %p

2

我在一份脚本中发现了这个选项,并想更多地了解它,谷歌将我带到了这里。在涉及的脚本中,该选项被给定为

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

所以命令使用双引号,选项值使用单引号。这不是其他答案中显示的形式之一,所以也许它能够满足你的需求?


2
以下内容有效。
java -classpath $CLASSPATH "-XX:OnOutOfMemoryError=touch 'worker.oome'"  $JVM_ARGS $MAIN

大多数提供的答案都不起作用。

然而,如果你想把它放在$JVM_ARGS变量中,那么你会遇到很多困难。


1

0

我甚至尝试使用%20嵌入空格,但那被当成字面意思。所以,当它遇到OOM时,它失败了,说找不到带有嵌入的%20的命令。疯狂,我知道,但值得一试... :)

也许我们应该像Sun文档那样使用实际的<和>?!:P 我会试试看... :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接