【问题标题】:-XX:OnOutOfMemoryError="kill -9 %p" Problem-XX:OnOutOfMemoryError="kill -9 %p" 问题
【发布时间】:2011-04-26 14:43:01
【问题描述】:

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

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

开始码头:开始码头 2011 年 4 月 26 日星期二 09:54:26 EDT
无法识别的选项:-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

评论 line out jetty 将毫无问题地开始。但是,由于系统内存泄漏,我们确实需要添加此参数,以防止我们的进程崩溃时进一步损坏。

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

【问题讨论】:

  • 我也遇到了类似的问题,但它在我自己的批处理/bash 文件中。也许 jetty 会在 .ini 文件中的所有内容上加上他自己的引号。您可以尝试使用单引号 (') 来代替吗?
  • 我想知道为什么它不起作用...它说-XX:OnOutOfMemoryError="<cmd args>;<cmd args>" Run user-defined commands when an OutOfMemoryError is first thrown. (Introduced in 1.4.2 update 12, 6) oracle.com/technetwork/java/javase/tech/…

标签: java jvm jetty


【解决方案1】:

在 Java 版本 8u92 中,VM 参数

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

已添加,请参阅release notes

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

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

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

【讨论】:

    【解决方案2】:

    作为 hadoop 选项运行我遇到了同样的问题。 这就是答案:

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

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

    【讨论】:

    • 我在这里打开了一个错误:bugs.eclipse.org/bugs/show_bug.cgi?id=408904 这应该在几年前就被报告为错误,我们本可以更早地解决它。
    • 错误sh: kill -9 1164: command not found 告诉你什么是重要的。传递给 sh 的可执行文件是 kill -9 1164(注意,这是它试图运行的可执行文件的名称)。证明:如果你现在在命令行上输入$ blargfish -9 1164 之类的东西,你会得到blarghfish: command not found。请注意,错误消息中不存在命令行参数。
    【解决方案3】:

    单引号版本现在应该可以在码头 >9.0.4 中正常工作。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我认为您需要引用整个选项,如下所示:

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

        【讨论】:

        • 如果我在整个选项周围加上引号,那么 id 不会出现在实际进程 args 中,我本来希望在这里看到它。虽然它确实启动了这是积极的。 //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。连接客户端.cfg -DLABEL=PROD_APP
        【解决方案6】:

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

        此外,如果您想测试更改,可以在终止之前回显一条消息。

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

        【讨论】:

          【解决方案7】:

          我在一个脚本中找到了这个选项,并想了解更多关于它的信息,谷歌把我带到了这里。在有问题的脚本中,选项给出为

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

          所以命令是双引号,选项值是单引号。这不是其他答案中显示的形式之一,所以也许它会做你想做的事?

          【讨论】:

            【解决方案8】:

            以下作品

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

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

            但是..如果你想把它放在例如$JVM_ARGS 变量让您陷入痛苦的世界。

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:

                我什至尝试使用 %20 嵌入空格,但这是字面意思。因此,当它收到 OOM 时,它会说找不到命令(带有嵌入式 %20)。很疯狂,我知道,但值得一试... :)

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

                【讨论】:

                  【解决方案11】:

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

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

                  如果您仍然没有空间,也许尝试让 shell 脚本找到与该 Jetty 实例关联的 pid?相当的 hack,但它可能会起作用。

                  【讨论】:

                    【解决方案12】:

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

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

                    【讨论】:

                      猜你喜欢
                      • 2017-09-29
                      • 1970-01-01
                      • 2016-05-02
                      • 2012-12-01
                      • 2016-07-26
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-10-24
                      • 2011-03-28
                      相关资源
                      最近更新 更多