使用java';s-XX:OnError选项

使用java';s-XX:OnError选项,java,jvm,Java,Jvm,我编写了以下代码: public class JavaErrorTest { public static void main(String[] args) { if (1 < 2) { throw new OutOfMemoryError(); } } } 在我的控制台中,我得到以下信息: Exception in thread "main" java.lang.OutOfMemoryError

我编写了以下代码:

public class JavaErrorTest {    
    public static void main(String[] args) {
        if (1 < 2) {
            throw new OutOfMemoryError();
        }
    }       
}
在我的控制台中,我得到以下信息:

Exception in thread "main" java.lang.OutOfMemoryError
    at JavaErrorTest.main(JavaErrorTest.java:5)
不知何故,我怀疑JVM选项没有被选中。我正在使用cygwin调用java,使用JDK1.6.0_30,在Windows 64位下运行

我做错了什么

编辑

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

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

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

基本上,我相信这是为了调试虚拟机,而不是用户代码


编辑:当使用
-XX:onAutofMemoryError
时,我看到当您从用户代码中显式抛出标志值时(无论如何,您不应该这样做),它不会使用标志值,而是在真正耗尽内存时使用它。例如:

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]);
        }
    }       
}
公共类测试{
公共静态void main(字符串[]args){
字符串[]x=新字符串[10000000];
对于(int i=0;i
运行时使用:

~ $ 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)
~$java-XX:onAutofmemoryError=“echo%p”测试
#
#java.lang.OutOfMemoryError:java堆空间
#-XX:OnOutOfMemoryError=“echo%p”
#正在执行/bin/sh-c“echo 29712”。。。
29712
线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间
位于java.util.Arrays.copyOf(Arrays.java:3057)
位于java.lang.String。(String.java:196)
at Test.main(Test.java:5)

(这仍然没有显示为
OnError
,这很公平-同样,它没有显示VM中的错误。)

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

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]);
这将触发相同的错误

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]);
List bytes=new ArrayList();
while(true)
添加(新字节[64*1024*1024]);

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

使用
-XX:onooutofmemoryerror
也会产生相同的错误result@chahuistle:如果实际内存不足(例如,重复使用内存),是否会产生相同的结果与只显式抛出
OutOfMemoryError
相反,不。。。如果真的发生OOE,我就会得到我想要的。谢谢该条件不是必需的。;)你能在给定的位置触摸一个不存在的文件而不是将内容回传出去吗?