说说堆和栈的区别
堆(Heap)和栈(Stack,指虚拟机栈)是 JVM 内存模型中两个核心区域,二者在存储内容、线程可见性、内存管理、生命周期等方面差异显著,具体对比如下:
| 对比维度 | 堆(Heap) | 栈(虚拟机栈) |
|---|---|---|
| 存储内容 | 存储 Java 对象实例(new创建的对象)和数组 | 存储方法执行时的栈帧(局部变量表、操作数栈等) |
| 线程可见性 | 线程共享,所有线程可访问堆中对象 | 线程私有,每个线程有独立的栈,不可跨线程访问 |
| 内存分配方式 | 动态分配(对象创建时分配,大小不确定) | 静态分配(栈帧大小编译时确定,方法调用时入栈) |
| 内存回收机制 | 依赖 GC 回收(对象不可达时被回收) | 无需 GC,栈帧随方法调用入栈、执行完出栈,自动释放 |
| 生命周期 | 与 JVM 一致(JVM 启动时创建,关闭时销毁) | 与线程一致(线程启动时创建,结束时销毁) |
| 异常类型 | 内存不足时抛出OutOfMemoryError: Java heap space | 栈深度超限抛出StackOverflowError,内存不足抛出OutOfMemoryError |
| 访问效率 | 效率低(需通过对象引用间接访问,存在 GC 开销) | 效率高(栈帧连续存储,直接通过栈指针访问) |
| 大小配置 | 通过-Xms(初始)、-Xmx(最大)配置 | 通过-XX:ThreadStackSize配置(默认 1MB) |
上次更新: 12/30/2025