Home » Java Basics » Java heap space – Everything you need to know

About Sotirios-Efstathios Maneas

Sotirios-Efstathios Maneas
Sotirios-Efstathios (Stathis) Maneas is a postgraduate student at the Department of Informatics and Telecommunications of The National and Kapodistrian University of Athens. His main interests include distributed systems, web crawling, model checking, operating systems, programming languages and web applications.

Java heap space – Everything you need to know

In this tutorial we will discuss about Java’s heap space. To begin with, the Java Virtual Machine (JVM) is the execution component of the Java Runtime Environment (JRE) that executes the bytecode residing in a Java .class file. While executing an application, new objects are created. The heap space is where all new objects are stored, while the application is being executed by the JVM.

When an application requires the creation of a new object, the JVM is responsible for allocating the necessary space. Thus, the JVM allocates a contiguous area of heap memory, in order for the new object to be stored. The Java heap space is generally located at the bottom of the address space and move upwards, as new objects are being created.

Each object in the heap that is referenced by any other object is called live and remains in the heap, as long as that condition is being held. Once an object is not referenced by any other object, it can be cleared out of the heap, in order for the JVM to reclaim and reuse that space. The execution thread that is responsible to clear the heap space is the Garbage Collector. The task of the Garbage Collector is to find all objects that are not referenced at all and reclaim their space. Usually, a Garbage Collector is being executed periodically by the JVM, in order for new space to be created.

The heap space is divided into generations:

  • The young generation: The young generation stores all short-lived objects that are created by an application and are cleared after a small number of garbage collections.
  • The old generation: The old generation holds all objects that have survived a number of minor garbage collections. These objects are moved from the young generator to the old one by the Garbage Collector.
  • The permanent generation (or permgen): The permanent generation is used for class definitions and the associated metadata. However, the permanent generation is not considered actual part of the heap space.

In a 32-bit architecture system, the maximum heap space of a Java application cannot exceed the 4 GBs. A Java process consists of many spaces and its allocated space cannot exceed the 4GBs. Specifically, a Java process consists of the following spaces:

  • Loaded libraries, including .jar and .class files.
  • Structures for manipulating the heap space.
  • Thread stacks.
  • Generated code by the JIT compiler.
  • Native memory of the application.

Getting information about the heap space

A Java application is able to gather information about the size of the heap space, the available heap space and the maximum size of the heap space, using the Runtime class. A sample main method that prints the aforementioned information is shown below:


public class HeapSizeExample {

     public static void main(String[] args) {
          System.out.println("Total Memory (in bytes): " + Runtime.getRuntime().totalMemory());
          System.out.println("Free Memory (in bytes): " + Runtime.getRuntime().freeMemory());
          System.out.println("Max Memory (in bytes): " + Runtime.getRuntime().maxMemory());

The execution of the main method in my personal computer prints the following information:

Total Memory (in bytes): 48234496
Free Memory (in bytes): 47730992
Max Memory (in bytes): 716177408

Notice that the results of the execution may differ from computer to computer and highly depend on the platform you execute the application. From example, the results may differ if you execute the same application from the Windows command line and from the Eclipse IDE.

Tuning the Java Virtual Machine

The size of the available heap space can be configured while starting the JVM. The most common configurations are shown below:


Set the initial size of the Heap.


Set the maximum size of the Heap.

Notice that you cannot change the size of the Java heap space during runtime. The parameters are specified only while starting the JVM. Also, the maximum heap size must be greater or equal than the heap’s initial size.

For more information about tuning the Java Heap space please visit this link.

Memory leaks

The Garbage Collector reclaims those objects that are not referenced by any other object, in order to free space. If an object is being referenced at least one time, then the Garbage Collector will not reclaim that object.

A memory leak can be created when there are objects inaccessible by the running code but still reside in main memory and cannot be collected. One common indication of a memory leak is the OutOfMemoryError. However, an OutOfMemoryError is not thrown only in cases of a memory leak.

This error is thrown by the JVM when there is no available space in the heap, in order to create a new Object. Moreover, the Garbage Collector cannot reclaim any Object from the heap and create free space and thus, the execution of the application is aborted. An OutOfMemoryError can also be thrown by the code of a native library, when the allocation cannot be satisfied.

The Java Development Kit (JDK) provides tools that help you acquire the heap dump of an application and analyze each heap dump. The jmap is a sample example of a memory map tool, while jhat is an example of a Java heap analysis tool.

This was a tutorial about Java’s heap space.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you our best selling eBooks for FREE!

1. JPA Mini Book

2. JVM Troubleshooting Guide

3. JUnit Tutorial for Unit Testing

4. Java Annotations Tutorial

5. Java Interview Questions

6. Spring Interview Questions

7. Android UI Design

and many more ....


Want to take your Java Skills to the next level?
Grab our programming books for FREE!
  • Save time by leveraging our field-tested solutions to common problems.
  • The books cover a wide range of topics, from JPA and JUnit, to JMeter and Android.
  • Each book comes as a standalone guide (with source code provided), so that you use it as reference.
Last Step ...

Where should we send the free eBooks?

Good Work!
To download the books, please verify your email address by following the instructions found on the email we just sent you.