java 标量替换_详解jvm中的标量替换
概述
通常在java中创建一个对象,大家都认为是在堆中创建。 在jdk6开始有逃逸分析,标量替换等技术,关于在堆中创建对象不再绝对。
关于标量替换,通过以下几点进行概述:
逃逸分析
标量替换是什么
测试标量替换
逃逸分析
逃逸分析是一种分析技术,分析对象的动态作用域,供其他优化措施提供依据。比如分析一个对象不会逃逸到方法之外或线程之外,其它优化措施(栈上分配,标量替换等)根据逃逸程度进行优化。
逃逸分析示例
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多次。
总结
可以看到通过逃逸分析与标量替换技术有效的减少了gc次数(减少了对象在堆中创建的数量)。
实际编码过程中避免对象逃逸情况是一种理想的情况。可以形成一种编码意识,尽量去减少对象逃逸。
思考
标量替换只是利用逃逸分析其中的一种优化措施, 还有其它优化措施吗?
以上就是详解jvm中的标量替换的详细内容,更多关于jvm 标量替换的资料请关注脚本之家其它相关文章!
java 标量替换_详解jvm中的标量替换相关推荐
- java 内存跟踪_详解JVM中的本机内存跟踪
1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...
- python中heapq的库是什么_详解Python中heapq模块的用法
详解Python中heapq模块的用法 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 详解Python中heapq模块的用法.txt ] (友情提示:右键点上行t ...
- pythonnamedtuple定义类型_详解Python中namedtuple的使用
namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...
- python3 yield 大文件_详解Python3中yield生成器的用法
任何使用yield的函数都称之为生成器,如: def count(n): while n > 0: yield n #生成值:n n -= 1 另外一种说法:生成器就是一个返回迭代器的函数,与普 ...
- java 拦截指定jsp_详解Struts2中对未登录jsp页面实现拦截功能
struts2中拦截器大家都很经常使用,但是拦截器只能拦截action不能拦截jsp页面.这个时候就有点尴尬了,按道理来说没登录的用户只能看login界面不能够通过输入url进行界面跳转,这显然是不合 ...
- python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发
strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...
- python namedtuple用法_详解Python中namedtuple的使用
namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...
- python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...
- 图文详解jvm中的线程状态
本文使用下面这张图详细介绍JAVA线程的六种状态 JAVA线程的六种状态详解 在java.lang.Thread类中,定义了线程的以下六种状态(同一个时刻线程只能有一种状态) NEW(新建) 这个状 ...
最新文章
- VGG16迁移学习实现
- 37. Leetcode 100. 相同的树 (二叉树-二叉树性质)
- VHDL数字钟的设计与制作
- Spring Cloud各组件总结归纳
- OpenCV4.0-alpha发布!新增多个深度学习特性
- 【Java教程系列】JavaSE核心知识点总结
- 中国超级计算机扩大领先优势:TOP500总量首次超越美国
- SCCM2012系列之六,SCCM2012部署前的WDS准备
- 未来智能合约平台的展望
- iphone7home键按压失灵_iPhone home键失灵怎么办 iPad home键失灵解决办法【详解】
- (八)Java日期工具类DateUtils详解(一)
- 微信小程序tabbar消失_微信小程序tabbar不显示解决办法
- 无法听到计算机发出的声音怎么办,为什么视频对方听不到我说话_电脑视频对方听不到声音的解决方法...
- 201919102004张雪婷(第七次作业)
- java 密码库_JCA-Java加密框架
- 陌陌发布新版 增加阅后即焚和短视频功能
- 特斯拉自动驾驶功能更新:将上线红绿灯识别自动停车
- SPARK-SQL - group分组聚合api,agg()
- H5-ffmpeg.js压缩视频
- 多语种互译批量中英文翻译插件
热门文章
- Python——Python编程方法与应用——程序示例
- Linux关机和重启shutdown、reboot命令
- 计算机图形Opengl的实验报告,opengl计算机图形学实验报告之3D漫游世界.doc
- 树莓派基础实验8:振动开关实验
- c#实现魔兽(warIII)中显血和改键功能
- 亚马逊电动玩具CPC认证测试标准要求
- 【VMware vSAN 7.0】6.13 将双节点集群分配给共享见证主机—我们有软硬件解决方案
- 2019-走向视频中的主观暴力检测TOWARD SUBJECTIVE VIOLENCE DETECTION IN VIDEOS
- java工程师技能以及大数据相关技术总结
- 商标驳回的理由和应对措施 。