используя опцию Java -XX: OnError - PullRequest
2 голосов
/ 19 января 2012

Я написал следующий код:

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 не используется. Я вызываю Java с помощью Cygwin, с помощью JDK 1.6.0_30, работает под Windows 64 бит.

Что я делаю не так?

EDIT

Следующая команда выдает тот же результат:

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

Ответы [ 2 ]

6 голосов
/ 19 января 2012

Я полагаю, что -XX:OnError предназначен для фатальных ошибок виртуальной машины - то есть "что-то не так с JIT, мы сгенерировали недопустимый код" - не "было выброшено необработанное исключение».(Даже если бы это было сгенерировано виртуальной машиной, я бы не считал это ошибкой виртуальной машины.)

По сути, я считаю, что это для отладки виртуальной машины, а не для кода пользователя.

РЕДАКТИРОВАТЬ:При использовании -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.)

0 голосов
/ 19 января 2012

Попробуйте следующее, хотя это не вызывает ту же ошибку.

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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...