使用Java的-XX:OnError选项

问题描述 投票:2回答:3

我写了以下代码:

public class JavaErrorTest {    
    public static void main(String[] args) {
        if (1 < 2) {
            throw new OutOfMemoryError();
        }
    }       
}

然后我像这样调用它:

$ java -XX:OnError="echo %p" JavaErrorTest

并且在我的控制台中,我得到以下信息:

Exception in thread "main" java.lang.OutOfMemoryError
    at JavaErrorTest.main(JavaErrorTest.java:5)

以某种方式,我怀疑-XX:OnError JVM选项没有被使用。我正在使用Windows 64位下运行的cygwin,jdk 1.6.0_30调用Java。

我在做什么错?

EDIT

以下命令产生相同的输出:

$ java -XX:OnOutOfMemoryError="echo %p" JavaErrorTest
java jvm
3个回答
6
投票

我相信-XX:OnError应该用于致命的[[虚拟机]]错误-即“ JIT出了点问题,我们生成了无效的代码”,而不是“引发了未处理的异常”。 (即使这是由VM抛出的,我也不会将其视为VM错误。)基本上我认为这是用于调试VM,而不是用户代码。

编辑:当使用-XX:OnOutOfMemoryError时,我看到它

在从用户代码中显式抛出它时使用标志值(无论如何都不应该这样做),但是在使用[时使用它您确实会耗尽记忆。例如:public class Test { public static void main(String[] args) { String[] x = new String[10000000]; for (int i = 0; i < x.length; i++) { x[i] = new String(new char[10000]); } } } 运行方式:
~ $ java -XX:OnOutOfMemoryError="echo %p" Test
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="echo %p"
#   Executing /bin/sh -c "echo 29712"...
29712
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3057)
    at java.lang.String.<init>(String.java:196)
    at Test.main(Test.java:5)

(虽然OnError并未显示此

still
,这很公平-再次,它没有显示VM中的错误。]

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.