逃逸分析技术是jvm用于提高性能以及节省内存的手段,在jvm编译语境下,逃逸分析通过以下两个条件判断该对象是否是逃逸的:
该对象是否分配在堆上(static关键字或者成员变量)该对象是否会传给未知代码,比如return到外部给别的类使用 逃逸技术的两个示例如下所示,这两段代码就是典型的情况2,将对象传给未知代码,造成逃逸
public class ObjectEscape{ private User user; public void init(){ user = new User(); }}
public class ObjectReturn{ public User createUser(){ User user = new User(); return user; }}
逃逸分析的优点 对象可能分配在栈上jvm会判断这个对象使用范围,就有一定可能性将对象分配在栈上,这样做的好处就是创建销毁速度会相对快些,而且节省堆区内存,表面gc的开销。
分离对象或标量替换由上文我们知道,对象有可能会被分配在栈上,那么jvm就会将这个对象打散,将对象打散为无数个小的局部变量,这样就方便在栈上分配内存了
同步锁消除如果jvm分析到这个锁只有一个对象会用到就会将这个锁消除。
参考文献逃逸分析,yyds!!