逃逸分析(Escape Analysis)

逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。

方法逃逸的几种方式如下:

public class EscapeTest {public static Object obj;public void globalVariableEscape() {  // 给全局变量赋值,发生逃逸obj = new Object();}public Object methodEscape() {  // 方法返回值,发生逃逸return new Object();}public void instanceEscape() {  // 实例引用发生逃逸test(this); }
}

栈上分配

栈上分配就是把方法中的变量和对象分配到栈上,方法执行完后自动销毁,而不需要垃圾回收的介入,从而提高系统性能。

同步消除

线程同步本身比较耗,如果确定一个对象不会逃逸出线程,无法被其它线程访问到,那该对象的读写就不会存在竞争,对这个变量的同步措施就可以消除掉。单线程中是没有锁竞争。(锁和锁块内的对象不会逃逸出线程就可以把这个同步块取消)

标量替换

Java虚拟机中的原始数据类型(int,long等数值类型以及reference类型等)都不能再进一步分解,它们就可以称为标量。相对的,如果一个数据可以继续分解,那它称为聚合量,Java中最典型的聚合量是对象。如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序真正执行的时候将可能不创建这个对象,而改为直接创建它的若干个被这个方法使用到的成员变量来代替。拆散后的变量便可以被单独分析与优化,
可以各自分别在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间了。

栈上分配深入分析

public class OnStackTest {public static void alloc(){byte[] b=new byte[2];b[0]=1;}public static void main(String[] args) {long b=System.currentTimeMillis();for(int i=0;i<100000000;i++){alloc();}long e=System.currentTimeMillis();System.out.println(e-b);}
}

-XX:+DoEscapeAnalysis开启逃逸分析(jdk1.8默认开启,其它版本未测试)
-XX:-DoEscapeAnalysis 关闭逃逸分析

开启逃逸分析,执行的时间为4毫秒。如下图:

关闭逃逸分析,执行的时间为618毫秒,并且伴随的大量的GC日志信息。如下图:

**通过上面开启和关闭逃逸分析:
开启逃逸分析,对象没有分配在堆上,没有进行GC,而是把对象分配在栈上。
关闭逃逸分析,对象全部分配在堆上,当堆中对象存满后,进行多次GC,导致执行时间大大延长。堆上分配比栈上分配慢上百倍。**

即时编译器(Just-in-time Compilation,JIT)
1、使用client编译器时,默认执行为1500次才认为是热代码;
2、使用server编译器时,默认执行为10000次才认为是热代码;
上面的例子开启逃逸分析后,并不是所有的对象都直接在栈上分配,而是通过JIT分析此代码是热代码,才进行异步编译成本地机器码,并通过逃逸分析,把对象分配到栈上。(如果是server编译器:在前10000次循环和编译成本地机器码这段时间,对象都会在堆中分配对象,编译成本地机器码后才会在栈上分配)

-XX:+EliminateAllocations开启标量替换(jdk1.8默认开启,其它版本未测试)
-XX:-EliminateAllocations 关闭标量替换
标量替换基于分析逃逸基础之上,开启标量替换必须开启逃逸分析

关闭标量替换

这次我们打开逃逸分析,并且把标量替换功能关闭,我们发现对象又分配到堆里面了,并执行了多次GC。由此可以看出java中没有实现真正意义上的栈上分配,而是通过标量替换来实现栈上分配的。

锁消除深入分析

把上面的OnStackTest代码稍微修改了下,加了一个同步块。默认数组长度大于64的是不会在栈上分配的,我们都以堆上分配为例来测试锁消除带来的影响。

public class OnStackTest {public static void alloc(){byte[] b=new byte[65];synchronized (b) {  //同步代码块b[0]=1;}}public static void main(String[] args) throws IOException {long b=System.currentTimeMillis();for(int i=0;i<100000000;i++){alloc();}long e=System.currentTimeMillis();System.out.println(e-b);}
}

-XX:+EliminateLocks开启锁消除(jdk1.8默认开启,其它版本未测试)
-XX:-EliminateLocks 关闭锁消除
锁消除基于分析逃逸基础之上,开启锁消除必须开启逃逸分析

开启锁消除

关闭锁消除

开启锁消除执行的时间为1807毫秒
关闭锁消除执行的时间为3801毫秒
通过开启和关闭锁消除我们可以看到性能最少提升1倍以上。

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

深入分析JVM逃逸分析对性能的影响相关推荐

  1. JVM逃逸分析(同步省略、标量替换、栈上分配)

    在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译是把.class转换成机器指令的过程. ...

  2. JVM 逃逸分析 (史上最全)

    对于JVM"逃逸分析" 特性,也是近年来大厂面试.高薪面试的常见面试题. 和逃逸分析有关的常见面试题: Java中的对象一定是在堆上分配的吗? 注:本文以 PDF 持续更新,最新尼 ...

  3. 深入理解JVM逃逸分析

    本文来说下JVM中的逃逸分析 文章目录 JIT 逃逸分析 同步消除 标量替换 栈上分配 编译阈值 本文小结 JIT 即时编译(Just-in-time Compilation,JIT)是一种通过在运行 ...

  4. 【Task】- JVM逃逸分析等待学习任务

    Tiered Compilation Compressed Oops Zero-Based Compressed Oops Escape Analysis NUMA Collector Enhance ...

  5. JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)

    1.是什么 (1) 基本概念:可运行 Java 代码的非真实计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回器,堆和一个存储方法域.它运行在操作系统之上,与硬件没有直接的交互. (2) ...

  6. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  7. java的标量和聚合量_欧尼酱讲JVM(16)——如何基于逃逸分析进行代码优化

    代码优化是一个涉及面很广的"工程",但是今天呢,本姑娘主要给大家分享基于逃逸分析,如何给代码做优化.那么逃逸分析是什么呢?我前面的文章也仔细的讲解过了,这里就不过多的赘述了.有不明 ...

  8. 深入理解Java中的逃逸分析

    转载自  深入理解Java中的逃逸分析 在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译 ...

  9. GC分类、TLAB、逃逸分析、栈上分配、同步消除、标量替换

    GC分类 JVM的调优的一个环节,也就是垃圾收集,我们需要尽量的避免垃圾回收,因为在垃圾回收的过程中,容易出现STW(Stop the World)的问题,而 Major GC 和 Full GC出现 ...

最新文章

  1. 详解OpenCV中的Lucas Kanade稀疏光流单应追踪器
  2. 高性能IO设计中的Reactor模式与Proactor模式
  3. 将旧版本从Java EE 5减少到7
  4. delete table 和 truncate table
  5. bash shell seq的用法
  6. 地铁译:Spark for python developers --- 搭建Spark虚拟环境 4...
  7. android studio撤回快捷键,Android Studio常用快捷键、Android Studio快捷键大全
  8. HUAWEI OSPF配置
  9. 三维扫描仪在工业生产中的作用
  10. 人工智能的认知技术,主要包含哪些?
  11. fyi 在邮件里是什么意思_FYI的完整形式是什么?
  12. MySQL功能大全(细品)
  13. 申请计算机软件著作权费用,申请计算机软件著作权费用多少有哪些费用
  14. UML之工具篇(Win10无法使用VGAPlayer播放asf格式与VGA课件的解决办法)
  15. tomcat部署web应用及架设论坛
  16. Big Sur系统下的mac重置
  17. 书单丨流量成本越来越高,6本书带你实现爆发式增长!
  18. biobakery流程之有参宏基因组分析
  19. java web分享ppt大纲 -- servlet容器简介
  20. 华为鲲鹏专家解读:90%代码如何移植到鲲鹏平台

热门文章

  1. kaggle房价预测问题
  2. 小白入门商业数据分析师的课程测评
  3. 这个顶会论文复现比赛,单篇最高现金奖3W!
  4. CVPR 2020最新热点:物体位姿估计
  5. 不知道读什么好?这 16 篇最新论文,帮你轻松积攒知识点
  6. 图像分割综述:FCN、U-Net、PSPNet、DeepLab
  7. 数学公式编辑器 linux,linux下的公式编辑器
  8. mysql数据类型所占空间大小
  9. 七牛云——对象存储私有空间下载凭证认证失败401[“error“:“download token auth failed“]解决方案
  10. [USACO1.3]滑雪课程设计Ski Course Design