前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM技术总结之五——JVM逃逸分析

JVM技术总结之五——JVM逃逸分析

作者头像
剑影啸清寒
发布2020-07-20 10:27:09
3280
发布2020-07-20 10:27:09
举报
文章被收录于专栏:琦小虾的Binary

接上篇《JVM技术总结之四——JVM内存结构》

五. JVM 逃逸分析

参考地址:《JVM的逃逸分析》

5.1 逃逸的定义

一个对象(或变量)在方法中处理完毕返回时,返回结果可能会被其他对象引用,或者全局引用,这种现象即为逃逸。或者可以说,一个对象指针被多个线程或方法引用时,该对象指针就是逃逸状态。

代码语言:javascript
复制
public StringBuilder escapeDemo1(String a, String b) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(a);
    stringBuilder.append(b);
    return stringBuilder;
}

上述代码中,StringBuilder 在方法中是局部的,但返回时可能会有多个线程或方法引用 StringBuilder,这时就构成了逃逸。如果要改为非逃逸情况,则应该返回 String,最后 return stringBuilder.toString()

5.2 逃逸分析的优化及原理

方法栈上对象的调用,正常情况下应该是栈向 Java 堆中查找对象的引用,然后从堆中加载该对象到栈中,直到方法结束。 逃逸分析的优化:不会将对象放到 Java 堆中,而是直接放到了栈中,此时该对象在栈中属于局部变量,不会发生逃逸。而且随着方法执行完毕,栈内存被回收,局部变量也回收了,这样也变相的减轻了 GC 的压力。

注:栈上分配与 TLAB 不同。栈上分配是直接在虚拟机栈中分配了内存,TLAB 是在堆中为线程特别开辟的一块小空间,为了给这个线程更高效的分配对象。

5.3 逃逸分析适用范围

由于栈空间一般小,无法存储大容量数据,所以目前的实现都是采用不那么准确,但是时间压力相对较小的算法来完成逃逸分析,可能导致效果不稳定。逃逸分析的效果只能在满足高频和高数量小容量的变量分配结构,才是合适的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 五. JVM 逃逸分析
    • 5.1 逃逸的定义
      • 5.2 逃逸分析的优化及原理
        • 5.3 逃逸分析适用范围
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档