逃逸分析

JVM的内存分配策略

首先回顾一下JVM的内存分配策略。

JVM的内存包括方法区、堆、虚拟机栈、本地方法栈、程序计数器。一般情况下JVM运行时的数据都是存在栈和堆上的。栈用来存放一些基本变量和对象的引用,堆用来存放数组和对象,也就是说new出来的实例。

随着JIT编译器的发展和逃逸分析的技术成熟,栈上分配、标量替换等优化技术,使对象不一定全都分配在堆中。

逃逸分析

逃逸分析是目前Java虚拟机中比较前沿的优化技术,也是JIT中一个很重要的优化技术。

它其实就是分析一个对象是否会逃逸出方法,分析对象的动态作用域。如果一个对象在一个方法内定义,并且有可能被方法外部引用使用,那认为它逃逸了。

方法逃逸

当一个对象在方法里面被定义后,它可能被外部方法所引用,例如调用参数传递到其他方法中,这种称为方法逃逸。

方法逃逸可以用个案例来演示一下:

//StringBuffer对象发生了方法逃逸
public static StringBuffer createStringBuffer(String s1, String s2) {
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
return sb;
}
// 非方法逃逸
public static String createString(String s1, String s2) {
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
return sb.toString();
}

可以看出,想要逃逸方法的话,需要让对象本身被外部调用。

线程逃逸

当一个对象可能被外部线程访问到,比如:赋值给其他线程中访问的实例变量,这种称为线程逃逸。

逃逸分析优化

通过逃逸分析,编译器会对代码进行优化。

如果能够证明一个对象不会逃逸到方法外或者线程外,或者说逃逸程度比较低,则可以对这个对象采用不同程度的优化:

栈上分配

完全不会逃逸的局部变量和不会逃逸出的线程对象,采用栈上分配,对象就会跟随方法的结束自动销毁,不会在堆上进行内存分配,减少垃圾回收器的压力。

标量替换

一个对象可能不需要作为一个连续的存储结果,存储也能被访问到,那么对象的部分可以不存储的在内存,而是存在CPU寄存器中。通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时,JVM不会创建该对象,而是将该对象成员变量分解若干个被这个方法使用的成员变量所代替,这些代替的成员变量在栈帧或寄存器上分配空间,这样就不会因为没有一大块连续空间导致对象内存不够分配。开启标量替换参数-XX:+EliminateAllocationsJDK7之后默认开启。

比如如下代码:

public static void main(String[] args) {
alloc();
} private static void alloc() {
Point point = new Point(1,2);
System.out.println("point.x="+point.x+"; point.y="+point.y);
}
class Point{
private int x;
private int y;
}

从以上代码可以看出,Point对象并没有逃逸出alloc方法,并且Point对象是可以拆解成标量的。那么,JIT就会不会直接创建Point对象,而是直接使用两个标量int x,int y来替代Point对象。

同步省略(锁消除)

如果一个对象发现只能在一个线程访问到,那么这个对象的操作可以考虑不同步。也就是说如果同步块所使用的锁对象通过这种分析被证实只能够被一个线程访问,那么JIT编译器在编译这个同步块的时候就会取消对这部分代码的同步。

通过JVM参数可以指定时候开启逃逸分析:

-XX:+DoEscapeAnalysis : 表示开启逃逸分析

-XX:-DoEscapeAnalysis : 表示关闭逃逸分析

JDK7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:-DoEscapeAnalysis

通过逃逸分析技术,对象可能被分配到栈上,可以减少GC,提高程序性能。

[JVM]逃逸分析的更多相关文章

  1. JVM逃逸分析

    开启逃逸分析: -server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m 关闭逃逸分析: -server -XX:-DoEsca ...

  2. Java之JVM逃逸分析

    引言: 逃逸分析(Escape Analysis)是众多JVM技术中的一个使用不多的技术点,本文将通过一个实例来分析其使用场景. 概念 逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配 ...

  3. 逃逸分析(Escape Analysis)

    一.什么是逃逸 逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到:这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量 ...

  4. JVM中启用逃逸分析

    -XX:+DoEscapeAnalysis 逃逸分析优化JVM原理我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针.当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量 ...

  5. JVM笔记-逃逸分析

    参考: http://www.iteye.com/topic/473355http://blog.sina.com.cn/s/blog_4b6047bc01000avq.html 什么是逃逸分析(Es ...

  6. JVM的逃逸分析

    我们都知道Java中的对象默认都是分配到堆上,在调用栈中,只保存了对象的指针.当对象不再使用后,需要依靠GC来遍历引用树并回收内存.如果堆中对象数量太多,回收对象还有整理内存,都会会带来时间上的消耗, ...

  7. JVM 优化之逃逸分析

    整理自 周志明<深入JVM> 1, 是JVM优化技术,它不是直接优化手段,而是为其它优化手段提供依据. 2,逃逸分析主要就是分析对象的动态作用域. 3,逃逸有两种:方法逃逸和线程逃逸.   ...

  8. JVM中的逃逸分析

    逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术. 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递 ...

  9. 小师妹学JVM之:逃逸分析和TLAB

    目录 简介 逃逸分析和栈上分配 TLAB简介 TLAB详解 设置TLAB空间的大小 TLAB中大对象的分配 TLAB空间中的浪费 总结 简介 逃逸分析我们在JDK14中JVM的性能优化一文中已经讲过了 ...

  10. JVM之基础概念(运行时数据区域、TLAB、逃逸分析、分层编译)

    运行时数据区域 JDK8 之前的内存布局 JDK8 之后的 JVM 内存布局 JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace),以前永 ...

随机推荐

  1. 2023Java面试学习网站推荐

    本文给大家推荐博主收藏的6个程序员面试学习站点,按照项目简介.网站截图.是否收费供大家参考. 1. JavaGuide 网站地址:https://javaguide.cn 项目简介:「Java学习 + ...

  2. freeswitch如何判断挂机方

    概述 freeswitch作为VOIP的软交换平台,需要对呼叫的信息做判断和归类. 常见的呼叫信息中,挂机方向的信息对于话单统计有很大的用处. 但是fs的原始话单和日志中并没有挂机方向的信息. 环境 ...

  3. 基于AHB_BUS的eFlash控制器的微架构设计

    eFlash微架构设计 1.回顾架构设计 2.Flash时序仿真 2.1 ahb_flashc项目目录 docs rtl sim tb model 2.2 docs 架构设计文档 微架构设计文档 集成 ...

  4. [IDEA] - tomcat VM配置

    -Dfile.encoding=UTF-8

  5. 聊聊x86计算机启动发生的事?

    大家好,我是呼噜噜,最近在看linux早期内核0.12的源码,突然想到一个困扰自己好久的问题:当我们按下电源键,计算机发生了什么?神秘地址0x7C00究竟是什么?操作系统又是如何被加载到硬件中的?带着 ...

  6. 神经网络优化篇:详解调试处理(Tuning process)

    调试处理 关于训练深度最难的事情之一是要处理的参数的数量,从学习速率\(a\)到Momentum(动量梯度下降法)的参数\(\beta\).如果使用Momentum或Adam优化算法的参数,\(\be ...

  7. [转帖]Oracle中为什么需要NCHAR

    https://zhuanlan.zhihu.com/p/668402759 Oracle中已经有了char.varchar2等字符类型,为什么又弄出一个nchar.nvarchar2? Oracle ...

  8. [转帖]Ceph优化系列(四):RocksDB 使用 ARM 64 位 CRC32C 硬件优化指令

    一.前言 CRC32(A cyclic redundancy check 32)应用于校验,为了保证数据的正确性,采用的一种检错手段. CRC32C (CRC32 Castagnoli)  与 CRC ...

  9. [转帖]Spring Cloud Alibaba Nacos 注册中心使用教程

    一. 什么是Nacos Nacos是一个更易于构建云原生应用的动态服务发现(Nacos Discovery ).服务配置(Nacos Config)和服务管理平台,集注册中心+配置中心+服务管理于一身 ...

  10. 金蝶Cosmic虚拟机简单使用与总结

    背景 知己知彼 简单学习下友商发出来的测试软件 看看有否对自己现在的工作有所指导 也看看对方的部署方式有啥优缺点 当然了仅是测试, 不是生产软件可能有失真. 注意 我没有测试序列号, 登录系统耗时很久 ...