-XX:OnOutOfMemoryError =“kill -9%p”问题

我有一个问题,试图将-XX:OnOutOfMemoryError="kill -9 %p"命令传递到我的jvm args中。

我正在使用Jetty7,并在start.ini文件中使用它。 在启动时,它给出了下面的错误。 这是jre /jre1.6.0_03l64

开始Jetty:STARTED 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'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 

评论docker出线将开始没问题。 但是,由于系统内存泄漏,我们确实需要添加此arg,以防止在我们的流程崩溃时进一步损坏。

有谁会知道我在这里做错了什么或我如何解决这个问题?

在Java版本8u92中的VM参数

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

添加了,请参阅发行说明 。

ExitOnOutOfMemoryError
启用此选项后,JVM会在第一次出现内存不足错误时退出。 如果您更喜欢重新启动JVM实例而不是处理内存不足错误,则可以使用它。

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

增强请求: JDK-8138745 (参数命名错误,但JDK-8154713 , ExitOnOutOfMemoryError而不是ExitOnOutOfMemory

我相信你需要引用整个选项,如下所示:

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

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

单引号版本现在可以在jetty> 9.0.4中正常工作。

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

我在脚本中找到了这个选项,想要了解更多相关内容,谷歌将我带到了这里。 在有问题的脚本中,选项为

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

因此该命令是双引号,选项值是单引号。 这不是其他答案中显示的forms之一,所以它可能会做你想要的吗?

在Oracle文档中 ,OnOutOfMemoryError具有签名:

 -XX:OnOutOfMemoryError="; " 

请注意,这意味着参数必须以分号分隔 ,而不是以空格分隔。

所以在上面提到的例子中,它应该是:

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

我甚至尝试使用%20嵌入一个空格,但字面意思是这样做的。 因此,当它有一个OOM时,它无法说找不到命令(带有嵌入的%20)。 疯了,我知道,但值得一试…… 🙂

也许我们应该像Sun文档一样使用实际的<和>? :P我会试试看… 🙂

如何而不是调用kill ,运行一个shell脚本,调用kill作为参数传递的pid(你仍然有一个空格,但没有-9标志)。

例如-XX:OnOutOfMemoryError='/path/killdash9.sh %p'

如果你仍然没有空间,也许尝试让shell脚本找到与该Jetty实例关联的pid? 相当黑客,但它可能会奏效。

在最近发布的Java 8(更新92)中,您现在可以选择使用“ExitOnOutOfMemoryError”选项。

http://www.oracle.com/technetwork/java/javase/8u92-relnotes-2949471.html

以下作品

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

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

但是..如果你想把它放在例如$ JVM_ARGS变量中,那么你就是一个痛苦的世界。

你需要使用-XX:OnOutOfMemoryError=/bin/kill -9 %p

此外,如果要测试更改,可以在杀死之前回显消息。

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