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

时间:2011-04-26 14:43:01

标签: java jvm jetty

尝试将-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

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

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

13 个答案:

答案 0 :(得分:18)

在Java版本8u92中,VM参数

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

已添加,请参阅release notes

  

<强> ExitOnOutOfMemoryError
  启用此选项后,JVM将退出   第一次出现内存不足错误。如果你可以使用它   更喜欢重新启动JVM的实例而不是处理掉   记忆错误。

     

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

单引号版本现在可以在jetty&gt; 9.0.4中正常工作了。

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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

的形式给出
-XX:OnOutOfMemoryError='"kill -9 %p"'

因此命令是双引号,选项值是单引号。这不是其他答案中显示的形式之一,所以它可能会按照您的意愿行事吗?

答案 6 :(得分:1)

以下作品

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

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

然而..如果你想把它放在例如你所处的$ JVM_ARGS变量是一个痛苦的世界。

答案 7 :(得分:0)

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

也许我们应该使用实际的&lt;和&gt;喜欢Sun docs?! :P我会试试...... :)

答案 8 :(得分:0)

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

e.g。 -XX:OnOutOfMemoryError='/path/killdash9.sh %p'

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

正确的语法是转义引号(“)

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

答案 12 :(得分:-3)

Oracle documentation中,OnOutOfMemoryError具有签名:

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

请注意,这里的意思是参数必须是以分号分隔,而不是以空格分隔。

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

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