2012-01-19 3 views
2

Я написал следующий код:с помощью -XX в Java: OnError вариант

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) 

Как-то, я подозреваю, что опция JVM -XX:OnError не подбирается. Я вызываю java, используя cygwin, используя jdk 1.6.0_30, работающий под 64 бит Windows.

Что я делаю неправильно?

EDIT

После команды производит тот же вывод:

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

Условие не требуется. ;) –

+0

Можете ли вы «прикоснуться» к несуществующему файлу в заданном месте, а не эхом оттуда? –

ответ

5

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

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

EDIT: При использовании -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

с использованием '-XX: OnOutOfMemoryError' производит тот же результат. – chahuistle

+1

@chahuistle: Получает ли он тот же результат, если вы * на самом деле * исчерпали память (например, многократно используя память), а не просто явно бросая' OutOfMemoryError'? –

+0

nope ... Если происходит * real * OOE, я получаю то, что искал. Благодаря! – chahuistle

0

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

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]); 
Смежные вопросы