使用Java的-XX:OnError选项 [英] using java's -XX:OnError option

查看:102
本文介绍了使用Java的-XX:OnError选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了以下代码:

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

然后我像这样调用它:

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

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

And in my console, I get the following:

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.

Somehow, I suspect that the -XX:OnError JVM option is not being picked up. I'm invoking java using cygwin, using jdk 1.6.0_30, running under Windows 64 bits.

我在做什么错了?

编辑

EDIT

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

Following command produces the same output:

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

推荐答案

我相信 -XX:OnError 用于致命的虚拟机错误-即"JIT出了点问题,我们生成了无效的代码",而不是引发了未处理的异常".(即使这是由VM抛出的,我也不认为这是VM错误.)

I believe -XX:OnError is meant to be used for fatal virtual machine errors - i.e. "something is wrong with the JIT, we've generated invalid code" - not "an unhandled exception has been thrown". (Even if this had been thrown by the VM, I wouldn't count this as a VM error.)

基本上我认为这是用于调试VM,而不是用户代码.

Basically I believe it's for debugging the VM, not user code.

当使用 -XX:OnOutOfMemoryError 时,我看到它在您从用户代码中显式抛出它时使用标志值(不应无论如何),但是确实会在真正耗尽内存时使用它.例如:

When using -XX:OnOutOfMemoryError I see it doesn't use the flag value when you explicitly throw it from user code (which you shouldn't be doing anyway) but does use it when you genuinely exhaust memory. For example:

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中显示错误.)

(This still isn't shown for OnError though, which is fair enough - again, it's not showing a bug in the VM.)

这篇关于使用Java的-XX:OnError选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆