java - 使用java的-XX :OnError option

标签 java jvm

我写了下面的代码:

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 选项没有被选中。我正在使用 cygwin 调用 java,使用 jdk 1.6.0_30,在 Windows 64 位下运行。

我做错了什么?

编辑

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

$ 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,这很公平 - 同样,它没有显示 VM 中的错误。)

关于java - 使用java的-XX :OnError option,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8924216/

相关文章:

java - Maven- POM.xml 中依赖项排序的重要性

java - 在 Linux 中作为其他用户选项运行

java - 哪些类型的方法最适合以 "static"的形式存在于 MVC 中?

java - 如果只有完全限定名称,如何获取 java 类的二进制名称?

java - 覆盖等于 : Telling IDE its okay to have different values?

java - 如何使用数据库中的值制作记事本文档

Java对象移动

c - JNI : call to a function where memset happens causes jvm-fetch to crash in the second call

java - 如何使JVM启动更快? [复制]

java - 现代 Java 如何优化自分配?