外观
一句话答案
逃逸分析判断对象是否逃出方法/线程,未逃逸的对象可栈上分配、标量替换、锁消除,减少 GC 压力。
核心要点
逃逸类型:
- 方法逃逸:对象被方法外引用(如 return、赋值给类变量)
- 线程逃逸:对象被其他线程访问(如赋给共享变量)
- 不逃逸:对象只在方法内使用
优化手段(对象不逃逸时):
- 栈上分配:对象直接在栈帧中分配,方法结束自动释放,无需 GC
- 标量替换:把对象拆散为基本类型字段,各自作为局部变量java
// 优化前 Point p = new Point(1, 2); return p.x + p.y; // 优化后(标量替换) int x = 1, y = 2; return x + y; - 锁消除:如果对象不逃逸,其上的 synchronized 可以被消除
JVM 参数:
-XX:+DoEscapeAnalysis(默认开启)-XX:+EliminateAllocations(标量替换)-XX:+EliminateLocks(锁消除)
追问与易错
追问方向:
- 怎么验证逃逸分析是否生效?
- 标量替换对性能提升大吗?
- HotSpot 有真正的栈上分配吗?
易错点:
- ❌ 开了逃逸分析就不分配堆了——只有不逃逸的对象才优化
- ❌ 认为所有短生命周期对象都能标量替换
💡 记忆锚点
逃逸分析就是问"这个对象会不会跑出方法/线程"。跑不出去的三大福利:栈上分配(方法结束自动释放,不劳GC)、标量替换(对象拆成零件当局部变量)、锁消除(没人竞争何必加锁)。JIT默认开启,是Java对象不一定在堆上的底气。