栈上分配 VS 堆分配 核心区别

一、基础定义

  1. 堆分配 默认常规创建对象方式,new 对象实例存堆,引用存在虚拟机栈。
  2. 栈上分配 JVM 逃逸分析优化:未逃逸对象直接分配在虚拟机栈,不在堆创建

二、核心对比

表格

对比项 堆分配 栈上分配
内存位置 JVM 堆内存 线程私有虚拟机栈
所属线程 线程共享 线程私有
回收方式 依靠 GC 垃圾回收 方法执行完自动出栈销毁,无 GC
分配速度 极快
内存大小 空间大 空间小,容量有限
触发条件 默认 new 对象就是堆分配 开启逃逸分析 + 对象不逃逸
线程安全 多线程可共享对象 仅当前方法使用,无共享
内存溢出风险 易 OOM 几乎不会
是否产生 GC 大量产生 GC 零 GC

三、使用场景

堆分配

  • 对象要返回出去
  • 赋值给成员变量、静态变量
  • 多线程共享对象
  • 全局长期存活对象

栈上分配

  • 对象只在当前方法内使用
  • 方法内临时对象,用完即弃
  • 循环内大量创建局部临时对象(优化最强)

四、生命周期区别

  • 堆分配:对象创建后,直到没有引用指向,才会被 GC 回收,存活时间不可控
  • 栈上分配方法结束立刻销毁,生命周期和方法一致

五、性能差距

  1. 堆分配:创建对象→分配堆内存→GC 扫描回收,开销大
  2. 栈上分配:栈内存直接开辟,方法结束自动释放,性能提升明显
  3. 搭配标量替换:连对象都不创建,直接拆成基本变量,性能拉满

六、面试极简背诵

  1. 堆分配在共享堆内存,靠 GC 回收;栈分配在线程栈,方法结束自动释放。
  2. 堆分配通用,栈分配依赖逃逸分析 + 对象不逃逸
  3. 栈上分配无 GC 开销,适合局部临时对象;需要对外暴露对象只能堆分配。

七、一句话总结

临时自用走栈上,对外暴露放堆里。

相关推荐
是小蟹呀^4 小时前
Spring Security + JWT 面试题整理
java·jwt·springsecurity
星栈独行6 小时前
翻完 Pi 源码:它和 Codex、Claude Code 有何不同
开发语言·javascript·人工智能·程序人生
spencer_tseng6 小时前
Redis + Nacos.bat
java·windows·dos
qq_448011166 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
troyzhxu7 小时前
列表查询的 GraphQL —— 一行代码终结你的 if-else 地狱!
java·springboot·graphql
孫治AllenSun7 小时前
【DataX】生产环境搭建DataX集群案例
java·开发语言·jvm
丈剑走天涯8 小时前
JVM(十) JDK8 CMS (Concurrent Mark Sweep)
jvm
c238568 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
好好沉淀8 小时前
@NotBlank(message = “{xxx}“) 注解中花括号的含义
java