这篇文章是自己总结JVM中Stack Memory与Heap Memory的区别,
1 Stack Memory解释
2 Heap Memory解释
heap memory主要是用来存储java程序创建的对象,例如new Object()
;此时,JVM会在heap memory分配一定的空间用来存储创建的Object对象.
JVM中的垃圾回收机制主要的工作就是释放heap memory中不被其他任何对象引用的对象(即不和其他任何对象建立关系的).
3 两者联系
以下面的代码为例,说明两者的关系:
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
}
4 总结
heap memory可以被应用中的所有部分使用,而Stack Memory只能被一个线程(thread)使用.
如果heap memory被使用完,系统会抛出OutOfMemoryError,而stack memory使用完会抛出StackOverFlowError.
如果一个对象被创建,它会被创建在heap memory, 而stack memory会保存一个创建对象的引用(类似C语言当中的指针)
创建在heap memory当中的对象,对于整个系统而言,都是可见的,然而,stack memory是不被其他线程所知的.
stack memory在内存管理时,采用的先进先出(FIFO),而heap memory整个管理就比较复杂(分为young gc, old gc以及其他的).
statck memory的生命周期比较短,而heap memory从应用启动到应用终止期间都会存在.
stack memory比heap memory的空间要小很多,由于stack memory采用FIFO,所以,相比较heap memory,stack memory的执行速度比heap memory要快.
参考说明:
1. http://www.journaldev.com/4098/java-heap-space-vs-stack-memory