Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by Value. After that I got a lot of emails to explain about Java Heap Space, Java Stack Memory, Memory Allocation in Java and what are the differences between them. You will see a lot of reference to Heap and Stack memory in Java, Java EE books and tutorials but hardly complete explanation of what is heap and stack memory in terms of a program.
Java Heap space is used by java runtime to allocate memory to Objects and JRE classes. Whenever we create an object, it’s always created in the Heap space. Garbage Collection runs on the heap memory to free the memory used by objects that don’t have any reference. Any object created in the heap space has global access and can be referenced from anywhere of the application.
Java Stack memory is used for the execution of a thread. They contain method-specific values that are short-lived and references to other objects in the heap that is getting referred from the method. Stack memory is always referenced in LIFO (Last-In-First-Out) order. Whenever a method is invoked, a new block is created in the stack memory for the method to hold local primitive values and reference to other objects in the method. As soon as the method ends, the block becomes unused and becomes available for the next method. Stack memory size is very less compared to Heap memory.
Let’s understand the Heap and Stack memory usage with a simple program.
package com.journaldev.test;
public class Memory {
public static void main(String[] args) { // Line 1
int i=1; // Line 2
Object obj = new Object(); // Line 3
Memory mem = new Memory(); // Line 4
mem.foo(obj); // Line 5
} // Line 9
private void foo(Object param) { // Line 6
String str = param.toString(); //// Line 7
System.out.println(str);
} // Line 8
}
The below image shows the Stack and Heap memory with reference to the above program and how they are being used to store primitive, Objects and reference variables. Let’s go through the steps of the execution of the program.
Based on the above explanations, we can easily conclude the following differences between Heap and Stack memory.
java.lang.StackOverFlowError
whereas if heap memory is full, it throws java.lang.OutOfMemoryError: Java Heap Space
error.That’s all for Java Heap Space vs Stack Memory in terms of java application, I hope it will clear your doubts regarding memory allocation when any java program is executed.
Reference: https://en.wikipedia.org/wiki/Java_memory_model.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.
Hello Sir, Is there any way I can download these interview question and answer in pdf format? All Questions from core java to Heap and stack memory!.. Let me know if there is a way!
- Pallavi
Thank you for your article I have a question. I wonder if xxxx.toString() automatically registers value itself to String Pool. I remember another column in some where, it explained that if we want to use xxxx.toString() often, we need to add itern() method to that value like this : xxxx.toString()
- Paik
very nicely explained thanks!
- unnamed
Thanks a lot, sir. can you please explain, when a static variable comes in it loads at the class area. Where is the class area?
- sinthujan
How does heap space look like during polymorpohism in java specially in case of upacasting?
- VISHAL PUNIR
what is java.lang.object@57? why is it in String pool .
- JIT
Hi Pankaj, Very nice explanation and logical. Makes sense. https://stackoverflow.com/questions/57380797/cannot-reach-a-temp-table-using-java-sql-statement-object-passed-as-a-map-value In this problem, what would you say has happened for memory allocation? a) new HashMap() means a new object in the heap. and stack has reference to it. b) put(key,value) means the value of the reference to the object. However, it seems the object cannot reach certain memory references if retrieved from within the HashMap. Would you be able to shed some light on that?
- M. Manna
Hi pankaj, As per above explanation ,you said that inside method local variables and data will be stored in stack but if created an object inside a method where will it store. is it store in stack or heap because its a local object? Regards, Gopi Reddy
- Gopi Reddy
What would be more efficent, declaring variable inside loop or outside? How Java handles this? Outside but once seems to be better, right? But is it really? Example1: for(int i=0; i< 1000000; i++) { int x = 0; //rest of code using ‘x’ variable } Example2: int x = 0; for(int i=0; i< 1000000; i++) { //rest of code using ‘x’ variable }
- DamianPL
As far as I understand both stack and heap memory stored in the RAM and difference is only in kind of interaction with that memory: random access with heap and LIFO with stack. Is it true?
- Dmitrii