我有一个问题,试图将-XX:OnOutOfMemoryError="kill -9 %p"
命令传递给我的jvm args。
我正在使用Jetty7,并在start.ini文件中使用它。在启动时,它给出了以下错误。这是jre /jre1.6.0_03l64
开始Jetty:STARTED Jetty Tue Apr 26 Apr 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'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
评论码头的线路将开始没问题。但是,由于系统内存泄漏,我们确实需要添加此arg,以防止在我们的流程崩溃时进一步损坏。
谁会知道我在这里做错了什么或我如何解决这个问题?
在Java版本8u92中的VM参数
-XX:+ExitOnOutOfMemoryError
-XX:+CrashOnOutOfMemoryError
添加了,请参阅release notes。
ExitOnOutOfMemoryError 启用此选项后,JVM会在第一次出现内存不足错误时退出。如果您更喜欢重新启动JVM实例而不是处理内存不足错误,则可以使用它。
CrashOnOutOfMemoryError 如果启用此选项,则在发生内存不足错误时,JVM会崩溃并生成文本和二进制崩溃文件。
增强请求:JDK-8138745(参数命名错误虽然JDK-8154713,ExitOnOutOfMemoryError
而不是ExitOnOutOfMemory
)
在最近发布的Java 8(更新92)中,您现在可以选择使用“ExitOnOutOfMemoryError”选项。
http://www.oracle.com/technetwork/java/javase/8u92-relnotes-2949471.html
你需要使用-XX:OnOutOfMemoryError=/bin/kill -9 %p
此外,如果要测试更改,可以在杀死之前回显消息。
-XX:OnOutOfMemoryError=/bin/date; /bin/echo custom message;/bin/kill -9 %p
正确的语法是转义引号(“)
-XX:OnOutOfMemoryError=\"kill -9 %p\"
在Oracle documentation中,OnOutOfMemoryError具有签名:
-XX:OnOutOfMemoryError="<cmd args>; <cmd args>"
请注意,这意味着参数必须以分号分隔,而不是以空格分隔。
所以在上面提到的例子中,它应该是:
-XX:OnOutOfMemoryError="kill;-9;%p"
我相信你需要引用整个选项,如下所示:
"-XX:OnOutOfMemoryError=kill -9 %p"
作为hadoop选项运行,我遇到了同样的问题。这就是答案:
-XX:OnOutOfMemoryError='kill -9 %p'
这是关于OOM的stdout:
#
# 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"
单引号版本现在可以在jetty> 9.0.4中正常工作。
我最近经历过这个问题。我已经通过将选项设置为JAVA_TOOL_OPTIONS
环境变量来解决它。这个变量记录在by Oracle中,你必须在shell命令中使用export
这个变量,而JVM
会将它附加到参数中。
我在脚本中找到了这个选项,想要了解更多相关内容,谷歌把我带到了这里。在有问题的脚本中,选项为
-XX:OnOutOfMemoryError='"kill -9 %p"'
因此命令是双引号,选项值是单引号。这不是其他答案中显示的形式之一,所以它可能会按照您的意愿行事吗?
以下作品
java -classpath $CLASSPATH "-XX:OnOutOfMemoryError=touch 'worker.oome'" $JVM_ARGS $MAIN
大多数提供的答案都不起作用。
但是..如果你想把它放在例如您所处的$ JVM_ARGS变量是一个痛苦的世界。
我甚至尝试使用%20嵌入一个空格,但这是从字面上理解的。因此,当它有一个OOM时,它无法说找不到命令(带有嵌入的%20)。疯了,我知道,但值得一试...... :)
也许我们应该像Sun文档一样使用实际的<和>? :P我会试试看... :)
如何而不是调用kill
,运行一个调用kill
的shell脚本,并将pid作为参数传递(你仍然有一个空格,但没有-9标志)。
例如-XX:OnOutOfMemoryError='/path/killdash9.sh %p'
如果你仍然没有空间,也许尝试让shell脚本找到与该Jetty实例相关的pid?相当黑客,但它可能会奏效。