Я полагаю, что -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.)