使用java的-XX:OnError选项

时间:2012-01-19 10:09:12

标签: java jvm

我写了以下代码:

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选项没有被选中。我正在使用cygwin调用java,使用jdk 1.6.0_30,在Windows 64位下运行。

我做错了什么?

修改

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

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

3 个答案:

答案 0 :(得分: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没有显示仍然,这是公平的 - 再次,它没有显示VM中的错误。)

答案 1 :(得分:0)

尝试以下操作,但不会触发相同的错误。

public static void main(String... args) {
    long[] l = new long[Integer.MAX_VALUE];
}  

这应该触发相同的错误。

List<byte[]> bytes = new ArrayList<byte[]>();
while (true)
    bytes.add(new byte[64 * 1024 * 1024]);

答案 2 :(得分:0)

要触发-XX:OnError,还需要使用-XX:+CrashOnOutOfMemoryError