堆(heap)和栈(stack)是Java内存管理的两个重要区域:
- 栈:由编译器自动分配和释放, 存放方法内局部变量和参数等。 其特点是:
- 方法的运行一结束,栈内的变量就被释放了。
- 采用FILO(先入后出)的方式进行管理。
- 变量在栈里的位置是确定的,可以直接通过变量名访问。
- 栈是线程私有的,每个线程都有自己的栈空间。
- 堆:由程序员通过new关键字分配,由GC回收。其特点是:
- 可以动态分配内存,数据规模不定。
- 存放对象和数组等。
- 变量在堆里的位置不定,通过引用(指针)访问。
- 堆是线程共享的。
下面是一个例子:
public void test() {
int count = 10; // count在栈中
MyObject obj = new MyObject(); // obj在栈中,new创建的MyObject在堆中
}
// count和obj的生命周期随着方法结束而结束,由栈管理
// MyObject的生命周期由垃圾回收器GC决定,由堆管理
总结:
- 变量分配在栈或堆取决于其类型(基本类型在栈,对象在堆)。
- 栈主要管理方法内的局部变量,生命周期随方法结束而结束。堆主要管理对象,生命周期由GC决定。
- 栈采用FILO存储方式,堆不定。
- 栈访问方式定址,堆通过引用访问。
- 栈线程私有,堆线程共享。