码迷,mamicode.com
首页 > 其他好文 > 详细

逃逸分析

时间:2020-07-12 20:25:42      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:com   复杂   线程   cap   传递   另一个   ati   临时   开始   

1、定义


逃逸分析的是一个对象的动态作用域,2种情况

方法逃逸:对象通过参数传递传给了另一个方法

线程逃逸:对象有另外的线程访问

逃逸分析的目的是确认一个对象是否只可能当前线程能访问

 

2、应用


如果对象分析后不能发生逃逸,如方法中创建的临时对象,则JVM可进行如下优化

1、栈上分配

      在栈上分配对象,应该只有当前线程使用,随方法的退出自动销毁,提升性能

2、标量替换

      所谓标量就是不能再分割的变量。如Java基本数据类型

      如果用到对象的标量,可以不分配对象,改为创建单独的标量放入栈或寄存器中。

3、锁消除

     因为只有当前线程使用,所以对此对象的锁操作可以优化去除

 

3、逃逸分析开关


Java8 逃逸分析默认是打开的,也可通过开关控制

-XX:+DoEscapeAnalysis开启逃逸分析
-XX:-DoEscapeAnalysis 关闭逃逸分析

-XX:+EliminateAllocations开启标量替换
-XX:-EliminateAllocations 关闭标量替换

-XX:+EliminateLocks开启锁消除(jdk1.8默认开启,其它版本未测试)
-XX:-EliminateLocks 关闭锁消除

(开启标量替换或锁消除 必须打开逃逸分析开关)

 

4、栈上分配


逃逸开关开启,且确认对象为发生逃逸,也并非所有的对象全是栈上分配的

首先逃逸分析是依赖JIT即时编译的 ,而触发JIT必须是热点代码,Server模式默认至少10000次方法执行才认为此方法是热点方法

从这个角度看,那一开始所有的对象还是在堆中分配。当前哪个分配是一个复杂的分析过程,我们要只要这回事即可(栈上分配不是绝对的

 

参考:

https://blog.csdn.net/w372426096/article/details/80333657

https://www.jianshu.com/p/04fcd0ea5af7

逃逸分析

标签:com   复杂   线程   cap   传递   另一个   ati   临时   开始   

原文地址:https://www.cnblogs.com/yangfei629/p/13289517.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!