Java程序的堆和栈是什么?代码举例讲解

Java程序的堆和栈是两个非常重要的运行时数据区域:

堆(Heap):

  1. 堆是Java运行时数据区域中最大的一块。
  2. 堆是线程共享的,所有的线程共用同一个堆。
  3. 堆是用来存放对象实例和数组的地方。
  4. 堆的空间需要在程序运行期动态分配,可以扩容。
  5. 堆由GC进行回收以释放内存。

栈(Stack):

  1. 栈是线程私有的,每个线程有自己的栈。
  2. 栈用于存放基本数据类型的变量,对象的引用,方法的调用等信息。
  3. 栈的空间在编译期就已经确定,最大为线程的栈容量。
  4. 栈是后进先出的结构,数据由栈顶压入和出栈。
  5. 栈不需要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++的中间结果入栈。