using java's -XX:OnError option

旧街凉风 提交于 2021-02-08 03:24:41

问题


I wrote the following code:

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

Then I invoke it like:

$ 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)

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.

What am I doing wrong?

EDIT

Following command produces the same output:

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

回答1:


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.)

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

EDIT: 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]);
        }
    }       
}

Run with:

~ $ 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)

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




回答2:


Try the following, though it doesn't trigger the same error.

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

This should trigger the same error.

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



回答3:


In order for the -XX:OnErrorto be triggered, you will need to use -XX:+CrashOnOutOfMemoryError also.



来源:https://stackoverflow.com/questions/8924216/using-javas-xxonerror-option

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!