Генериране на дъмп на 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
Искахте да кажете, че heap файлът не е генериран? И не трябва ли да е -XX:-HeapDumpOnOutOfMemoryError вместо -XX:+HeapDumpOnOutOfMemoryError (забележете знака +)   -  person CoolBeans    schedule 08.02.2011
comment
›Програмата се проваля с OutOfMemory, но сега се изхвърля, ако се генерира файл. -- Печатна грешка ли е? - имаш предвид сега или не?   -  person Ralph    schedule 08.02.2011
comment
@CoolBeans: Официалният сайт: docs .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