逃逸分析(escape Analysis)
2012-08-04 23:47
204 查看
逃逸分析----在计算机语言编译器语言优化管理中,分析指针动态范围的方法称之为逃逸分析(通俗点讲,当一个对象 的指针被多个方法或线程引用时)---我们称这个指针发生了逃逸
我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针。
当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量较多,将给GC带来较大压力,也间接影响了应用的性能。减少临时对象在堆内分配的数量,无疑是最有效的优化方法。
怎么减少临时对象在堆内的分配数量呢?不可能不实例化对象吧!
场景介绍
其实,在java应用里普遍存在一种场景。一般是在方法体内,声明了一个局部变量,且该变量在方法执行生命周期内未发生逃逸(在方法体内,未将引用暴露给外面)。
按照JVM内存分配机制,首先会在堆里创建变量类的实例,然后将返回的对象指针压入调用栈,继续执行。
这是优化前,JVM的处理方式。
逃逸分析优化 - 栈上分配
优化原理:分析找到未逃逸的变量,将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量对象也被回收。
这是优化后的处理方式,对比可以看出,主要区别在栈空间直接作为临时对象的存储介质。从而减少了临时对象在堆内的分配数量。
逃逸分析的原理很简单,但JVM在应用过程中,还是有诸多考虑。
比如,逃逸分析不能在静态编译时进行,必须在JIT里完成。原因是,与java的动态性有冲突。因为你可以在运行时,通过动态代理改变一个类的行为,此时,逃逸分析是无法得知类已经变化了。
public class G { public static B b; public void globalVariablePointerEscape(){//给全局变量赋值,发生逃逸 b=new B(); } public B methodPointerEscape(){//方法返回值,发生逃逸 return new B(); } public void instancePassPointerEscape(){ methodPointerEscape().printClassName(this);//实例引用发生逃逸 } } class B{ public void printClassName(G g){ System.out.println(g.getClass().getName()); } }在这个例子中,一共举了3种常见的指针逃逸场景。分别是 全局变量赋值,方法返回值,实例引用传递。
逃逸分析优化JVM原理
我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针。当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量较多,将给GC带来较大压力,也间接影响了应用的性能。减少临时对象在堆内分配的数量,无疑是最有效的优化方法。
怎么减少临时对象在堆内的分配数量呢?不可能不实例化对象吧!
场景介绍
其实,在java应用里普遍存在一种场景。一般是在方法体内,声明了一个局部变量,且该变量在方法执行生命周期内未发生逃逸(在方法体内,未将引用暴露给外面)。
按照JVM内存分配机制,首先会在堆里创建变量类的实例,然后将返回的对象指针压入调用栈,继续执行。
这是优化前,JVM的处理方式。
逃逸分析优化 - 栈上分配
优化原理:分析找到未逃逸的变量,将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量对象也被回收。
这是优化后的处理方式,对比可以看出,主要区别在栈空间直接作为临时对象的存储介质。从而减少了临时对象在堆内的分配数量。
逃逸分析的原理很简单,但JVM在应用过程中,还是有诸多考虑。
比如,逃逸分析不能在静态编译时进行,必须在JIT里完成。原因是,与java的动态性有冲突。因为你可以在运行时,通过动态代理改变一个类的行为,此时,逃逸分析是无法得知类已经变化了。
相关文章推荐
- JVM的栈上分配与逃逸分析(Escape Analysis)
- JIT编译器里面的“逃逸分析”(Escape analysis)
- JVM优化之逃逸分析(Escape Analysis)
- 逃逸分析-escape analysis
- JVM优化之逃逸分析(Escape Analysis)
- 逃逸分析(escape Analysis)
- 什么是逃逸分析(Escape Analysis)?
- PCA(Principal Component Analysis)原理简单分析
- 【机器学习-斯坦福】学习笔记14 主成分分析(Principal components analysis)-最大方差解释
- Linux Performance Analysis and Tools(Linux性能分析和工具)
- LoadRunner_Analysis(z) 分析
- 线性判别分析(Linear Discriminant Analysis)(二)
- 主成分分析(Principal components analysis)-最大方差解释
- PCA--主成分分析(Principal components analysis)-最小平方误差解释
- 微软的招聘新理念“共事回归分析” PRA (Peer Regression Analysis)
- JVM中的逃逸分析
- Gensim官方教程翻译(七)——分布式潜在语义分析案例(Distributed Latent Semantic Analysis)
- 线性判别分析(Linear Discriminant Analysis)
- LoadRunner_Analysis(z) 分析
- Analysis of Touch Panel Driver of Marvell (Marvell PXA310触摸屏驱动代码分析)