逃逸分析与标量替换

什么是逃逸分析?

我们知道,对象一般被存储在堆中,堆中就涉及到分代概念,GC概念等一系列需要消耗资源的问题。为了避免频繁的GC,JVM也给出了解决方案,这个方案就是逃逸分析。逃逸分析的作用就是将一些小的并且不会发生逃逸的对象放在栈中,放在栈中的好处是显而易见的,不需要GC来进行回收,直接使用在栈中执行完后跟随方法出栈一同销毁。

启动命令:`-XX:+DoEscapeAnalysis`(1.7之后默认开启)

如何判定对象是否会发生逃逸?

如果想搞明白这个问题,首先要知道什么叫对象逃逸?

对象逃逸就是,一个方法中定义了一个返回值,返回值是个对象,这个被返回的对象就叫做发生了对象逃逸,这个对象逃逸出了这个方法的执行范围,也就是说不能跟随方法执行完毕一同被销毁。

知道了什么是对象逃逸,我们就可以明确如何判断了,在方法内创建,并且没有被方法返回值返回到方法外,也没有被返回值引用的,可跟随方法一同销毁的对象就是非逃逸对象。

但这时候又有了一个问题,栈内存没有一个对象这么大的连续内存空间怎么办?

这就引出了本文题目中的另一个解决方案,标量替换。

什么是标量替换?

众所周知,一个对象内部可能有很多个变量,前文也说到了标量替换是为了解决栈中没有这么大的连续空间而出现的。标量替换给出的解决方案就是不将这些不会逃逸并且可拆解的对象创建出来,而是将对象中的变量拿出来创建若干个成员变量。

启动命令:-XX:+EliminateAllocations(1.7之后默认开启)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容