我写了以下代码:
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
我相信-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中的错误。]