8

I have a program that should eventually generate OutOfMemory . The program code is:

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");
        }
    }
}

I run the program with the following parameters:

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

The program fails with OutOfMemory but no dump file is generated . Do you have any idea why?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at VeryLargeObject.<init>(VeryLargeObject.java:14)
        at VeryLargeObject.main(VeryLargeObject.java:32)
Bacteria
  • 8,406
  • 10
  • 50
  • 67
Andrei Ciobanu
  • 12,500
  • 24
  • 85
  • 118
  • 3
    Did you mean to say the heap file didnt generate? And shouldn't it be -XX:-HeapDumpOnOutOfMemoryError instead of -XX:+HeapDumpOnOutOfMemoryError (notice the + sign) – CoolBeans Feb 08 '11 at 16:29
  • >The program fails with OutOfMemory but now dump if file is generated. -- Is it a typo? - do you mean **now** or **no**? – Ralph Feb 08 '11 at 16:43
  • @CoolBeans: The official site: https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/clopts.html says that the option shoud be with + sign – Balaban Mario Jun 08 '18 at 08:41
  • @BalabanMario Hi - I am sorry, I am not sure if I follow. So the official docs say the same thing right? "-XX:+HeapDumpOnOutOfMemoryError" ? Were you just confirm that? – CoolBeans Jun 08 '18 at 15:55

3 Answers3

19

The problem is that -XX:HeapDumpPath spefies a file and not a path.

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

added:

and bestsss is right too, so you need to fix both "errors":

java -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" VeryLargeObject
Community
  • 1
  • 1
Ralph
  • 118,862
  • 56
  • 287
  • 383
  • 3
    '-XX:HeapDumpPath' can also be a path, like this: '-XX:HeapDumpPath=c:/', which will generate dumps with the pattern "java_pid4128.hprof" in the root direcoty of drive C: – It's Leto Mar 10 '14 at 17:45
9

For starter drop the XX options and any options BEFORE VeryLargeObject, otherwise you pass the parameters to the java program and not the JVM

bestsss
  • 11,796
  • 3
  • 53
  • 63
5

I suspect the jvm could not write to the path and fails silently. For example, this has to be a file name in a directory which exists. If you have a directory D:\workspace it will fail. If you have D:\workspace\heap.hprof it may work. Try creating a blank file of that name first to see you can do this.

Peter Lawrey
  • 525,659
  • 79
  • 751
  • 1,130