逃逸分析是jvm在运行时判断对象是否被外部代码引用的静态分析技术,用于优化内存分配。通过该分析,jvm可以将未发生逃逸的对象分配到栈上而非堆中,从而减少垃圾回收(gc)的压力并提升程序性能。

哪些对象会发生逃逸
对象逃逸主要分为全局数据区逃逸和线程逃逸两种情况。全局数据区逃逸指对象被赋值给类变量或存储在不受限的容器(如静态List)中;线程逃逸指对象虽仅在当前线程使用,但被传递到当前线程之外(如存入共享集合)。只有完全未发生逃逸的对象才能进行栈上分配。

public class EscapeAnalysisDemo {
// 全局数据区逃逸:对象被赋值给静态成员变量
private static Object globalRef;
public void globalEscape() {
Object obj = new Object();
globalRef = obj; // 发生全局逃逸
}
public void threadEscape() {
Object obj = new Object();
// 假设有一个共享队列
SharedQueue.add(obj); // 发生线程逃逸
}
public void noEscape() {
Object obj = new Object();
// 仅在方法内使用,未返回也未赋值给外部变量
System.out.println(obj);
}
}
逃逸分析带来的优化手段
基于逃逸分析的结果,JVM主要实施栈上分配、同步消除和标量替换三种优化。栈上分配将短生命周期对象放在栈中,随方法调用结束自动销毁;同步消除针对无竞争锁进行优化;标量替换则将对象拆解为基本类型变量,直接在寄存器或栈帧中操作,避免创建对象实例。

public class OptimizationDemo {
// 标量替换示例:Point对象可能被拆解为x和y
public Point createPoint() {
Point p = new Point(1, 2);
return p;
}
// 同步消除示例:锁仅在当前线程可见
public synchronized void safeMethod() {
// 逻辑处理
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











