简体   繁体   中英

Does throwing OutOfMemoryError trigger the heap dump, or does memory actually need to be exhausted?

Does throwing OutOfMemoryError trigger the heap dump, or does memory actually need to be exhausted?

In other words, will a heap dump be produced if I:

throw new java.lang.OutOfMemoryError();

and have set

-XX:+HeapDumpOnOutOfMemoryError

Is this universally true for all JVMs, or is this likely to be vendor-specific?

Why: I want to simulate OOME for testing purposes, and would prefer to have a one-line way of doing this. Just throwing the Error seems logical.

Because the documentation doesn't say so and it may or may not be vendor specific, I would just create a large object to force an OOME.

I used this simple Runnable to spawn a Thread causing an OOME when I needed to:

private static class OOMRunnable implements Runnable {

    private static final int ALLOCATE_STEP_SIZE = 1_000_000;

    @Override
    public void run() {
        long bytesUsed = 0L;
        List<long[]> eatingMemory = new ArrayList<>();

        while (true) {
            eatingMemory.add(new long[ALLOCATE_STEP_SIZE]);
            bytesUsed += Long.BYTES * ALLOCATE_STEP_SIZE;

            System.out.printf("%d MB allocated%n", bytesUsed / 1_000_000);
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM