Генерировать дамп Java, когда OutOfMemory

У меня есть программа, которая в конечном итоге должна сгенерировать 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)

person Andrei Ciobanu    schedule 08.02.2011    source источник
comment
Вы хотели сказать, что файл кучи не сгенерирован? И разве это не должно быть -XX:-HeapDumpOnOutOfMemoryError вместо -XX:+HeapDumpOnOutOfMemoryError (обратите внимание на знак +)   -  person CoolBeans    schedule 08.02.2011
comment
›Программа завершается с ошибкой OutOfMemory, но теперь создается дамп, если файл создается. -- Это опечатка? - вы имеете в виду сейчас или нет?   -  person Ralph    schedule 08.02.2011
comment
@CoolBeans: официальный сайт: документы .oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/ говорит, что опция должна быть со знаком +   -  person Balaban Mario    schedule 08.06.2018
comment
@BalabanMario Привет. Извините, я не уверен, что понимаю. Значит, официальные документы говорят то же самое, верно? -XX:+HeapDumpOnOutOfMemoryError ? Вы только что это подтвердили?   -  person CoolBeans    schedule 08.06.2018


Ответы (3)


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

person Community    schedule 08.02.2011
comment
я не нашел никакой документации для VeryLargeObject, можете ли вы дать нам какую-нибудь подлинную ссылку. - person Vipin; 04.02.2014
comment
@Vipin, «VeryLargeObject» — это класс, содержащий main(String[]). Посмотрите на вопрос, сам. - person bestsss; 05.05.2014
comment
я не заметил, а теперь понял :) - person Vipin; 07.05.2014

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

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

добавлено:

и bestsss тоже правильно, поэтому вам нужно исправить обе "ошибки ":

java -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" VeryLargeObject
person Ralph    schedule 08.02.2011
comment
'-XX:HeapDumpPath' также может быть путем, например: '-XX:HeapDumpPath=c:/', который будет генерировать дампы с шаблоном java_pid4128.hprof в корневом каталоге диска C: - person It's Leto; 10.03.2014

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

person Peter Lawrey    schedule 08.02.2011