JVM-
逃逸分析
一个对象的指针被多个方法或者线程引用时,即可称这个指针发生了逃逸。
发生逃逸的几种场景
- 全局变量赋值
- 方法返回值
- 实例引用
优化步骤
- 找到未逃逸的变量
- 将变量在栈上分配
- 随着线程的结束,栈空间被回收,局部变量对象也被回收。
- 与直接在堆上分配的区别:在栈空间作为临时对象的存储介质,从而减少临时对象在堆上的分配数量。
- 合理利用栈中对象的生命周期。
逃逸分析的其他俩个优化应用
- 同步消除:如果一个对象始终只被一个线程访问,那么该对象的同步操作就可以转化成没有同步保护的操作(栈是线程私有的),能大大提高并发和性能。
- 矢量替代:如果对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内,这样能大大加快访问速度。
不理解的地方:逃逸分析不能在静态编译时进行,必须在JIT
里完成,可以在运行时通过动态代理改变一个类的行为,此时,逃逸分析是无法得知类已经变化了。
相关参数
- 开启逃逸分析:-XX:+DoEscapeAnalysis
- 开启标量替换:-XX:+EliminateAllocations
评论区