The OutOfMemoryError is thrown by JVM, when JVM does not have enough available memory, to allocate.
OutOfMemoryError falls into the error category (Exception class hierarchy) of VirtualMachineError.
Exception class hierarchy
We have shown some of exception classes in Fig 1.
The simulation of OutOfMemoryError:
We will allocate large chunk of memory, which will exhaust heap memory storage.
We will keep on allocating the memory (in below program) and point will reach, when JVM will not have enough memory to allocate, then.
OutOfMemoryError will be thrown
We will catch out of memory error (Note: we can not recover from error conditions e.g. OutOfMemoryError, StackOverflowError etc.).
We can log the OutOfMemoryError (e.g to generate the statistics etc).
Program to simulate or generate OutOfMemoryError in java.
package org.learn;
public class SimulateOutOfMemoryError {
public static void main(String[] args) throws Exception {
int dummyArraySize = 15;
System.out.println("Max JVM memory: " + Runtime.getRuntime().maxMemory());
long memoryConsumed = 0;
try {
long[] memoryAllocated = null;
for (int loop = 0; loop < Integer.MAX_VALUE; loop++) {
memoryAllocated = new long[dummyArraySize];
memoryAllocated[0] = 0;
memoryConsumed += dummyArraySize * Long.SIZE;
System.out.println("Memory Consumed till now: " + memoryConsumed);
dummyArraySize *= dummyArraySize * 2;
Thread.sleep(500);
}
} catch (OutOfMemoryError outofMemory) {
System.out.println("Catching out of memory error");
//Log the information,so that we can generate the statistics (latter on).
throw outofMemory;
}
}
}
Output of OutOfMemoryError (usage of JVM memory)
Max JVM memory: 926941184
Memory Consumed till now: 960
Memory Consumed till now: 29760
Memory Consumed till now: 25949760
Catching out of memory error
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.learn.SimulateOutOfMemoryError.main(SimulateOutOfMemoryError.java:13)