侧边栏壁纸
博主头像
晓果冻博主等级

一个热爱生活的95后精神小伙

  • 累计撰写 131 篇文章
  • 累计创建 15 个标签
  • 累计收到 67 条评论

目 录CONTENT

文章目录

JVM-逃逸分析

晓果冻
2022-03-31 / 0 评论 / 1 点赞 / 352 阅读 / 450 字
温馨提示:
本文最后更新于 2022-04-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

JVM-逃逸分析

一个对象的指针被多个方法或者线程引用时,即可称这个指针发生了逃逸。
发生逃逸的几种场景
  1. 全局变量赋值
  2. 方法返回值
  3. 实例引用
优化步骤
  1. 找到未逃逸的变量
  2. 将变量在栈上分配
  3. 随着线程的结束,栈空间被回收,局部变量对象也被回收。
    • 与直接在堆上分配的区别:在栈空间作为临时对象的存储介质,从而减少临时对象在堆上的分配数量。
    • 合理利用栈中对象的生命周期。
逃逸分析的其他俩个优化应用
  • 同步消除:如果一个对象始终只被一个线程访问,那么该对象的同步操作就可以转化成没有同步保护的操作(栈是线程私有的),能大大提高并发和性能。
  • 矢量替代:如果对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内,这样能大大加快访问速度。

不理解的地方:逃逸分析不能在静态编译时进行,必须在JIT里完成,可以在运行时通过动态代理改变一个类的行为,此时,逃逸分析是无法得知类已经变化了。

相关参数
  1. 开启逃逸分析:-XX:+DoEscapeAnalysis
  2. 开启标量替换:-XX:+EliminateAllocations
1

评论区