Skip to content
困难

一句话答案

逃逸分析判断对象是否逃出方法/线程,未逃逸的对象可栈上分配、标量替换、锁消除,减少 GC 压力。

核心要点

逃逸类型:

  • 方法逃逸:对象被方法外引用(如 return、赋值给类变量)
  • 线程逃逸:对象被其他线程访问(如赋给共享变量)
  • 不逃逸:对象只在方法内使用

优化手段(对象不逃逸时):

  1. 栈上分配:对象直接在栈帧中分配,方法结束自动释放,无需 GC
  2. 标量替换:把对象拆散为基本类型字段,各自作为局部变量
    java
    // 优化前
    Point p = new Point(1, 2);
    return p.x + p.y;
    // 优化后(标量替换)
    int x = 1, y = 2;
    return x + y;
  3. 锁消除:如果对象不逃逸,其上的 synchronized 可以被消除

JVM 参数:

  • -XX:+DoEscapeAnalysis(默认开启)
  • -XX:+EliminateAllocations(标量替换)
  • -XX:+EliminateLocks(锁消除)
追问与易错

追问方向:

  • 怎么验证逃逸分析是否生效?
  • 标量替换对性能提升大吗?
  • HotSpot 有真正的栈上分配吗?

易错点:

  • ❌ 开了逃逸分析就不分配堆了——只有不逃逸的对象才优化
  • ❌ 认为所有短生命周期对象都能标量替换

💡 记忆锚点

逃逸分析就是问"这个对象会不会跑出方法/线程"。跑不出去的三大福利:栈上分配(方法结束自动释放,不劳GC)、标量替换(对象拆成零件当局部变量)、锁消除(没人竞争何必加锁)。JIT默认开启,是Java对象不一定在堆上的底气。