逃逸分析

一、逃逸分析

  • 逃逸分析的作用:分析对象动态作用域。

  • 逃逸分析的对象:方法中的变量。

  • 逃逸分析的分类:

    方法逃逸:一个对象在方法中定义后,他可能被外部方法所引用,譬如作为调用参数传递到其他方法中,称为方法逃逸。
    线程逃逸:一个对象在方法中定义后,他可能被外部线程所访问,譬如赋值给类变量或可以在其他线程中访问到的实例变量,称为线程逃逸。

二、逃逸分析带来的优化

当证明一个对象不会逃逸到方法或者线程之外时,jvm可以为这个变量进行一些高效的优化:

  • 栈上分配:如果确定一个对象变量不会方法逃逸,那么对象就会分配到栈空间,对象随着栈帧出栈而销毁。(大量对象随着方法的结束而自动销毁,可以减小GC系统的压力)

  • 同步消除:如果确定一个对象变量不会线程逃逸,那这个变量读写就一定不会有竞争,对这个变量的同步措施就可以被消除掉。

  • 标量替换:如果确定一个对象变量不会方法逃逸,且这个变量是聚合量,那jvm真正执行的时候将可能不创建这个对象,而改为创建它的若干个被这个方法使用到的成员变量(标量)来代替。

    标量:指一个数据无法再分解成更小的数据,像Java中的基本数据类型:int 、long、reference等;
    聚合量:指一个数据可以继续分解成其他数据,像封装多个属性的java对象;

注意:

  1. 逃逸分析技术不成熟在于:逃逸分析的性能收益不能保证高于逃逸分析的消耗

  2. 在Java代码运行时,通过JVM参数可指定是否开启逃逸分析
    -XX:+DoEscapeAnalysis : 表示开启逃逸分析
    -XX:-DoEscapeAnalysis : 表示关闭逃逸分析
    从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:- DoEscapeAnalysis

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值