2011-02-08 3 views
5

У меня есть программа, которая должна в конечном итоге генерировать OutOfMemory. Программа код:Создайте java-свалку, когда OutOfMemory

public class VeryLargeObject implements Serializable { 
    public static final int SIZE = 1 << 12; 

    public String tag; 
    public int[][] bigOne = new int[SIZE][SIZE]; 

    { 
     // Initialize bigOne 
     for(int i = 0; i < SIZE ; ++i) { 
      for(int j = 0; j < SIZE; ++j) { 
       bigOne[i][j] = (int) (Math.random() * 100); 
      } 
     } 
    } 

    public VeryLargeObject(String tag) { 
     this.tag = tag; 
    } 

    public static void main(String args[]) { 
     VeryLargeObject[] vla = new VeryLargeObject[1 << 12]; 
     for(int i = 0; i < Integer.MAX_VALUE; ++i) { 
      vla[i] = new VeryLargeObject("aa"); 
     } 
    } 
} 

Я запустить программу со следующими параметрами:

java VeryLargeObject -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="D:\workspace" 

Программа завершается с OutOfMemory но файла дампа не генерируется. Вы знаете, почему?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at VeryLargeObject.<init>(VeryLargeObject.java:14) 
     at VeryLargeObject.main(VeryLargeObject.java:32) 
+3

Вы имели в виду сказать, что файл кучи не генерировал? И не должно быть -XX: -HeapDumpOnOutOfMemoryError вместо -XX: + HeapDumpOnOutOfMemoryError (обратите внимание на знак +) – CoolBeans

+0

> Программа выходит из строя с OutOfMemory, но теперь дамп, если файл сгенерирован. - Это опечатка? - Вы имеете в виду ** сейчас ** или ** нет **? – Ralph

ответ

8

Для стартера уронить варианты XX и любые варианты ДОVeryLargeObject, иначе вы передадите параметры в программу java, а не JVM

+0

i dont найти документацию для VeryLargeObject, можете ли вы дать нам аутентичную ссылку. – Vipin

+0

@Vipin, 'VeryLargeObject' - это класс, содержащий 'main (String [])'. Посмотрите на вопрос, сам. – bestsss

+0

Я этого не замечал, ну теперь я получил его :) – Vipin

5

Я подозреваю, что JVM не может написать на пути и не тихо. Например, это должно быть имя файла в каталоге, который существует. Если у вас есть каталог D:\workspace, это не удастся. Если у вас есть D:\workspace\heap.hprof, это может сработать. Сначала попробуйте создать пустой файл этого имени, чтобы увидеть, что вы можете это сделать.

+1

+1 на 25 секунд быстрее меня – Ralph

+1

параметры неуместны – bestsss

14

Проблема в том, что -XX:HeapDumpPath spefies файл, а не путь.

-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" 

добавил:

и bestsss правильно, так что вы должны установить оба "ошибки":

java -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" VeryLargeObject 
+3

'-XX: HeapDumpPath' также может быть путем, например: '-XX: HeapDumpPath = c: /', который будет генерировать дампы с шаблоном "java_pid4128 .hprof "в корневой директории диска C: –