我写了以下代码:
public class JavaErrorTest {
public static void main(String[] args) {
if (1 < 2) {
throw new OutOfMemoryError();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我调用它:
$ java -XX:OnError="echo %p" JavaErrorTest
Run Code Online (Sandbox Code Playgroud)
在我的控制台中,我得到以下内容:
Exception in thread "main" java.lang.OutOfMemoryError
at JavaErrorTest.main(JavaErrorTest.java:5)
Run Code Online (Sandbox Code Playgroud)
不知何故,我怀疑-XX:OnErrorJVM选项没有被选中.我正在使用cygwin调用java,使用jdk 1.6.0_30,在Windows 64位下运行.
我究竟做错了什么?
编辑
以下命令产生相同的输出:
$ java -XX:OnOutOfMemoryError="echo %p" JavaErrorTest
Run Code Online (Sandbox Code Playgroud)
我认为-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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行:
~ $ 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)
Run Code Online (Sandbox Code Playgroud)
(但这仍然没有显示OnError,这是公平的 - 再次,它没有显示VM中的错误.)
| 归档时间: |
|
| 查看次数: |
3839 次 |
| 最近记录: |