您好,登录后才能下订单哦!
这期内容当中小编将会给大家带来有关带你了解jvm中的标量替换,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
逃逸分析
逃逸分析是一种分析技术,分析对象的动态作用域,供其他优化措施提供依据。比如分析一个对象不会逃逸到方法之外或线程之外,其它优化措施(栈上分配,标量替换等)根据逃逸程度进行优化。
逃逸分析示例
public class EscapeAnalysis { public Person p; /** * 发生逃逸,对象被返回到方法作用域以外,被方法外部,线程外部都可以访问 */ public void escape(){ p = new Person(26, "TomCoding escape"); } /** * 不会逃逸,对象在方法内部 */ public String noEscape(){ Person person = new Person(26, "TomCoding noEscape"); return person.name; } } static class Person { public int age; public String name; ... // 省略构造方法 }
标量替换是什么
标量可以理解成一种不可分解的变量,如java内部的基本数据类型、引用类型等。 与之对应的聚合量是可以被拆解的,如对象。
当通过逃逸分析一个对象只会作用于方法内部,虚拟机可以通过使用标量替换来进行优化。
比如上述noEscape()方法中person对象只会在方法内部,通过标量替换技术得到如下伪码:
/** * 不会逃逸,对象在方法内部 */ public String noEscape(){ int age = 26; String name = "TomCoding noEscape"; return name; }
测试标量替换
接下来我们通过对noEscape()方法进行测试,主要测试两种场景:
以下测试是在jdk8中运行(注jdk8默认是开启逃逸分析,标量替换技术的)
测试代码如下:
void testEliminateAllocationsWithNoEscape() { int n = 100000000; long start = System.currentTimeMillis(); EscapeAnalysis escapeAnalysis = new EscapeAnalysis(); for (int i = 0; i < n; i++) { // noEscape()不会发生逃逸 escapeAnalysis.noEscape(); } System.out.println("耗时:" + (System.currentTimeMillis() - start)); }
将jvm参数设置如下:
-Xms5m 最小堆内存5M -Xmx5m 最大堆内存5M -XX:+PrintGC 打印gc日志 -XX:-EliminateAllocations 关闭标量替换优化
运行后在我本机的耗时:3006毫秒,gc发生2000多次。
将jvm参数设置如下:
-Xms5m 最小堆内存5M -Xmx5m 最大堆内存5M -XX:+PrintGC 打印gc日志 -XX:+EliminateAllocations 关闭标量替换优化
运行后在我本机的耗时:20毫秒,gc发生6次。
再来看看发生逃逸的对象使用标量替换效果
测试代码如下:
void testEliminateAllocationsWithEscape() { int n = 100000000; long start = System.currentTimeMillis(); EscapeAnalysis escapeAnalysis = new EscapeAnalysis(); for (int i = 0; i < n; i++) { // escape()发生逃逸 escapeAnalysis.escape(); } System.out.println("耗时:" + (System.currentTimeMillis() - start)); }
将jvm参数设置如下:
-Xms5m 最小堆内存5M -Xmx5m 最大堆内存5M -XX:+PrintGC 打印gc日志 -XX:+EliminateAllocations 关闭标量替换优化
运行后在我本机的耗时:3705毫秒,gc发生2000多次。
上述就是小编为大家分享的带你了解jvm中的标量替换了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。