Java程序的堆和栈是两个非常重要的运行时数据区域:
堆(Heap):
- 堆是Java运行时数据区域中最大的一块。
- 堆是线程共享的,所有的线程共用同一个堆。
- 堆是用来存放对象实例和数组的地方。
- 堆的空间需要在程序运行期动态分配,可以扩容。
- 堆由GC进行回收以释放内存。
栈(Stack):
- 栈是线程私有的,每个线程有自己的栈。
- 栈用于存放基本数据类型的变量,对象的引用,方法的调用等信息。
- 栈的空间在编译期就已经确定,最大为线程的栈容量。
- 栈是后进先出的结构,数据由栈顶压入和出栈。
- 栈不需要GC回收,方法结束后自动释放。
来看一个简单例子:
public class HeapAndStackDemo {
public static void main(String[] args) {
int count = 0; // count变量入栈
RuntimeDataArea obj = new RuntimeDataArea(); // obj对象在堆中
method1(); // 方法调用入栈
count++; // 操作数入栈
}
public static void method1() {
int num = 10; // num变量入栈
}
}
在该程序运行时:
- count、num变量存储在各自线程的栈中。
- obj对象实例存储在堆中。
- method1方法调用信息入栈。
- count++的中间结果入栈。