使用Java的-XX:OnError选项 [英] using java's -XX:OnError option
问题描述
我编写了以下代码:
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屋!