分类: Java
2016-03-31 23:13:46
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 Memory, Java Stack Memory 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.
Heap memory is used by java runtime to allocate memory to Objects and JRE classes. Whenever we create any object, it’s always created in the Heap space. Garbage Collection runs on the heap memory to free the memory used by objects that doesn’t have any reference. Any object created in the heap space has global access and can be referenced from anywhere of the application.
堆内存是由java运行时用来分配内存的对象和类的JRE。每当我们创建任何对象时,它总是在堆空间中创建。垃圾收集运行在堆内存中,当一个对象没有引用时,将被释放它对应的内存。在堆空间中创建的任何对象都具有全局访问,并且可以从应用程序的任何地方引用。
Java Stack memory is used for execution of a thread. They contain method specific values that are short-lived and references to other objects in the heap that are 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 method ends, the block becomes unused and become available for next method.
Stack memory size is very less compared to Heap memory.
Java 栈内存是执行一个线程时使用的。They contain method specific values that are short-lived and references to other objects in the heap that are getting referred from the method. 栈内存总是LIFO(后进先出)。
无论何时当一个方法被调用时,一个新的内存块在栈内被建立起来给这个方法使用,用于保存局部变量值和在次方法中引用的其它对象。
当方法结束时,该块将的无用并可以被下一个方法使用这块内存。
栈内存大小远小于堆的内存大小。
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 }
Below image shows the Stack and Heap memory with reference to above program and how they are being used to store primitive, Objects and reference variables.存储原始、对象和引用变量。
Let’s go through the steps of execution of the program.
每当一个对象被创建时,它总是存储在堆空间和堆栈的内存中,包含了它的引用。栈内存中只包含本地的原始变量和引用变量在堆空间中的对象。
存储在堆中的对象是全局访问的,而栈内存不能被其他线程访问。
在栈内存管理是后进先出的方式进行,而在堆内存的更复杂,因为它是全局使用。堆内存分为年轻的一代,老一代等,更多的细节在java的垃圾收集
栈内存是短暂的,而堆内存的生命从开始到应用程序结束。
我们可以使用-Xms和-Xmx选项启动JVM定义大小和堆内存的最大尺寸。我们可以使用XSS定义栈的内存大小。
当栈内存已满,java运行时抛出java.lang.stackoverflowerror
如果堆内存已满,把java.lang.outofmemoryerror:Java Heap Space error.。
栈内存大小与堆内存相比要少多。因为在内存分配的简单(LIFO),栈内存比堆内存快的多。
That’s all for Stack vs Heap Memory in terms of java application, I hope it will clear your doubts regarding memory allocation when any java program is executed.
I have made a video tutorial for this, you should watch it to clarify any doubts.