How to solve java.lang.outofmemoryerror: java heap space or exception in thread “main”? Know reasons caused by and how to solve it guide.

Introduction

In Java JVM allocates a defined memory size for storing objects created during program execution known as Java Heap Space. Along with it, JVM allocates another memory called PermGen space: permanent generation space.

java.lang.outofmemoryerror java heap space

Java Heap Space

However, we can change the default size with the JVM options.

Most importantly, Oracle completely removed this memory space in the JDK 8 release.

Java 8 memory management heap

Memory space in the JDK 8 release

Understanding OutOfMemoryError in Java

There most common reason for this error is simple –

If we try to fit a large application into a smaller space. In other words, the application just requires more Java heap space than available to it to operate normally.

Other causes:

  1. Spikes in usage/data volume- The application was designed to handle a certain amount of users or a certain amount of data. When the number of users or the volume of data suddenly spikes and crosses the expected limit. The operation which functioned normally before the spike ceases to operate and triggers the OutOfMemoryError.
  2. Memory leaks- A particular type of programming error will lead your application to constantly consume more memory. Every time the leaking functionality of the application is used it leaves some objects behind in the Java heap space. Over time the leaked objects consume all of the available heap space and trigger the already familiar OutOfMemoryError.

Exception in thread “main” java.lang.outofmemoryerror: java heap space

Exception in thread "main" java.lang.OutOfMemoryError

What is causing it?

Generally, bad programming results in OutOfMemoryError. OutOfMemoryError usually means that we’re doing something wrong, either holding onto objects too long or trying to process too much data at a time. Sometimes, it indicates a problem that’s out of our control, such as a third-party library that caches strings, or an application server that doesn’t clean up after deploys.

GC Overhead limit exceeded- This error indicates that the garbage collector is running all the time and the Java program is making very slow progress. If such an event occurs then an OutOfMemoryError is thrown.

Stack vs Java Heap Space

Heap Space
Whenever we create an object, it’s always created in the Heap space.

Stack Memory
Java Stack memory is used for the execution of a thread. It also contains method references.

Note: String Pool is also a part of Java Heap Memory.

Solving  java.lang.outofmemoryerror: java heap space error

Increase Java Heap size in Java

The default size of Heap space in Java is 128MB on most of 32 bit Sun’s JVM but it highly varies from JVM to JVM.

For instance, the default maximum and start heap size for the 32-bit Solaris Operating System (SPARC Platform Edition) is -Xms=3670K and -Xmx=64M. And default values of heap size parameters on 64-bit systems have been increased up by approximately 30%.

Also, if we are using a throughput garbage collector in Java 1.5 default maximum heap size of JVM would be Physical Memory/4, and the default initial heap size would be Physical Memory/16.

Another way to find the default heap size of JVM is to start an application with default heap parameters and monitor using JConsole. It is available on JDK 1.5 onwards, on the VMSummary tab, you will be able to see the maximum heap size.

Moreover, we can increase the size of java heap space based on our application need and it is always recommended to avoid using default JVM heap values. Therefore, if our application is large and lots of objects are created. We can change the size of heap space by using JVM options -Xms and -Xmx. Here, Xms denotes the starting size of Heap while -Xmx denotes the maximum size of Heap in Java.

There is another parameter called -Xmn. It denotes the size of the new generation of Java Heap Space. The only thing is we can’t change the size of Heap in Java dynamically. We can only provide the Java Heap Size parameter while starting JVM.

Conclusion

We hope you got your error resolved. Let us know by commenting if you need any help or have any questions.

If this article helped you feel free to share. Keep reading and sharing. Kudos!!