概述

通常在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中的标量替换相关推荐

  1. java 内存跟踪_详解JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

  2. python中heapq的库是什么_详解Python中heapq模块的用法

    详解Python中heapq模块的用法 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  详解Python中heapq模块的用法.txt ] (友情提示:右键点上行t ...

  3. pythonnamedtuple定义类型_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

  4. python3 yield 大文件_详解Python3中yield生成器的用法

    任何使用yield的函数都称之为生成器,如: def count(n): while n > 0: yield n #生成值:n n -= 1 另外一种说法:生成器就是一个返回迭代器的函数,与普 ...

  5. java 拦截指定jsp_详解Struts2中对未登录jsp页面实现拦截功能

    struts2中拦截器大家都很经常使用,但是拦截器只能拦截action不能拦截jsp页面.这个时候就有点尴尬了,按道理来说没登录的用户只能看login界面不能够通过输入url进行界面跳转,这显然是不合 ...

  6. python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发

    strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...

  7. python namedtuple用法_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

  8. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

  9. 图文详解jvm中的线程状态

    本文使用下面这张图详细介绍JAVA线程的六种状态 JAVA线程的六种状态详解 在java.lang.Thread类中,定义了线程的以下六种状态(同一个时刻线程只能有一种状态)  NEW(新建) 这个状 ...

最新文章

  1. VGG16迁移学习实现
  2. 37. Leetcode 100. 相同的树 (二叉树-二叉树性质)
  3. VHDL数字钟的设计与制作
  4. Spring Cloud各组件总结归纳
  5. OpenCV4.0-alpha发布!新增多个深度学习特性
  6. 【Java教程系列】JavaSE核心知识点总结
  7. 中国超级计算机扩大领先优势:TOP500总量首次超越美国
  8. SCCM2012系列之六,SCCM2012部署前的WDS准备
  9. 未来智能合约平台的展望
  10. iphone7home键按压失灵_iPhone home键失灵怎么办 iPad home键失灵解决办法【详解】
  11. (八)Java日期工具类DateUtils详解(一)
  12. 微信小程序tabbar消失_微信小程序tabbar不显示解决办法
  13. 无法听到计算机发出的声音怎么办,为什么视频对方听不到我说话_电脑视频对方听不到声音的解决方法...
  14. 201919102004张雪婷(第七次作业)
  15. java 密码库_JCA-Java加密框架
  16. 陌陌发布新版 增加阅后即焚和短视频功能
  17. 特斯拉自动驾驶功能更新:将上线红绿灯识别自动停车
  18. SPARK-SQL - group分组聚合api,agg()
  19. H5-ffmpeg.js压缩视频
  20. 多语种互译批量中英文翻译插件

热门文章

  1. Python——Python编程方法与应用——程序示例
  2. Linux关机和重启shutdown、reboot命令
  3. 计算机图形Opengl的实验报告,opengl计算机图形学实验报告之3D漫游世界.doc
  4. 树莓派基础实验8:振动开关实验
  5. c#实现魔兽(warIII)中显血和改键功能
  6. 亚马逊电动玩具CPC认证测试标准要求
  7. 【VMware vSAN 7.0】6.13 将双节点集群分配给共享见证主机—我们有软硬件解决方案
  8. 2019-走向视频中的主观暴力检测TOWARD SUBJECTIVE VIOLENCE DETECTION IN VIDEOS
  9. java工程师技能以及大数据相关技术总结
  10. 商标驳回的理由和应对措施 。