加载中...

逃逸分析(Escape Analysis)是一种指针/引用的静态分析,判断某个对象的引用是否会「逃出」创建它的方法或线程:被返回、存入全局、传给其他线程等即为逃逸。
若对象被证明不逃逸,编译器可实施多种优化:栈上分配(免去堆分配与 GC 压力)、标量替换(把对象拆散为若干局部变量,进一步放入寄存器)、锁消除(对线程私有对象的同步操作可直接删除)。
HotSpot JVM 的 C2 编译器自 JDK 6 起默认开启逃逸分析,实际主要落地为标量替换与锁消除;Go 编译器在编译期做逃逸分析决定变量分配在栈还是堆,go build -gcflags=-m 可查看分析结果。
分析是保守的:反射、动态调用、复杂别名会使对象被判为逃逸;过程间精确分析代价高,通常配合内联进行。

登录 后参与讨论
暂无讨论,来发表第一条评论吧