逃逸分析

在看了周志明先生的深入理解JVM的逃逸分析后,记了一些笔记同时也有了一些看法

那么什么是逃逸分析呢?

逃逸分析本身不是一种优化技术,在这一点上它和类型继承分析技术是一样,它们都是为其他优化提供依据的一种分析技术。

同时我们先搞清楚两个名词,方法逃逸和线程逃逸

方法逃逸:当一个对象在方法中被定义后,因为可能被外部方法引用,比如作为调用参数被传递到其他的方法里。

线程逃逸:当一个对象在方法中被定义后,可能被外部线程访问到,比如给类变量或者在其他线程中访问的实例变量。

如果可以证明一个方法不会逃逸到线程或者方法的外面,那么久可以进行优化。

那么逃逸分析能不能在编译期间进行呢?

首先需要弄清楚两个概念,静态编译和动态编译

静态编译指的是javac之类的编译,动态编译指的是JIT等即时编译。

因为Sun公司不在对javac这方面的进行优化。所以优化基本上都是在JVM中,

通过查询资料得到

Excelsior JET 这个东西要比我们主流的HOTSPOT更早实现了逃逸分析和相关优化,

但是不知道Java在运行期间不知道会 加载上什么代码。Java有很多的小方法,虚方法的调用,难以进行静态分析。

同时逃逸分析需要 在比较大的代码快中工作才会比较有效。因为编译器需要了解更多的代码。用于更加准确的判断对象有没有逃逸,

只在小块代码上分析的话,很多的时候都得到错误的判断,就没有效果了。

得出一个结论:

逃逸分析可以在编译期运行,但是由于技术上面的一些原因,所以是在运行期间进行的比较多。

怎么判断一个对象是不是会逃逸?

对数据流敏感的一系列的分析,从而确定能够程序各个分支执行对这个对象的影响,

那么逃逸分析有什么优化技术呢?

首先就是栈上分配,众所周知,Java对象的创建都是在堆上,但是如果是在栈上分配的话。那么对象就会随着方法的

结束而自动销毁,对垃圾收集系统的压力就会小很多,当然因为存在技术上的问题,这个功能没有被实现。

同步消除:如果一个变量不会逃逸出线程,无法被加载,那么这个变量的读写就不会存在竞争,对这个变量实施的同步消除也可以被清楚。

标量替换:标量是指一个数据无法分解成更小的数据,基础类型的数据都算是标量,对象可以被分解成其他的成员变量,所以说变量不是

标量,那么标量替换是指在运行期间,不必要创建对象,而是改成创建对象的成员变量,不仅可以让对象成员在栈上分配和读写之外,还

可以为后一步的优化技术创造了条件。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值