JVM原理 | 逃逸分析
逃逸分析
1. 何为"逃逸"(Escape)?
当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他方法或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。
例子 :
public StringBuilder escapeDemo1(String a, String b) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(a);stringBuilder.append(b);return stringBuilder;
}
上述代码则会发生逃逸
如果改成 :
public String escapeDemo2(String a, String b) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(a);stringBuilder.append(b);return stringBuilder.toString();
}
就不会发生逃逸
2. 什么是逃逸分析
逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
逃逸分析(Escape Analysis)算是目前Java虚拟机中比较前沿的优化技术了。
3. 逃逸分析的原理
Java本身的限制(对象只能分配到堆中),为了减少临时对象在堆内分配的数量,我会在一个方法体内定义一个局部变量,并且该变量在方法执行过程中未发生逃逸,按照JVM调优机制,
- 优化前 : 首先会在堆内存创建类的实例,然后将此对象的引用压入调用栈,继续执行
- 优化后 : 针对栈的重新分配方式,首先找出未逃逸的变量,将该变量直接存到栈里,无需进入堆,分配完成后,继续调用栈内执行,最后线程执行结束,栈空间被回收,局部变量也被回收了。如此操作,是优化前在堆中,优化后在栈中,从而减少了堆中对象的分配和销毁,从而优化性能。
总结: 不逃逸的对象, 只存在栈中, 减少了堆压力, 从而得到优化效果;
4. 逃逸的方式
- 方法逃逸: 在一个方法体内,定义一个局部变量,而它可能被外部方法引用,比如作为调用参数传递给方法,或作为对象直接返回。或者,可以理解成对象跳出了方法。
- 线程逃逸: 这个对象被其他线程访问到,比如赋值给了实例变量,并被其他线程访问到了。对象逃出了当前线程。
5. 逃逸分析的好处
如果一个对象不会在方法体内,或线程内发生逃逸(或者说是通过逃逸分析后,使其未能发生逃逸)
逃逸分析后的三大优点 :
栈上分配 : 一般情况下,不会逃逸的对象所占空间比较大,如果能使用栈上的空间,那么大量的对象将随方法的结束而销毁,减轻了GC压力
同步消除 : 如果你定义的类的方法上有同步锁,但在运行时,却只有一个线程在访问,此时逃逸分析后的机器码,会去掉同步锁运行。
标量替换 :
Java虚拟机中的原始数据类型
(int,long等数值类型以及reference类型等)
都不能再进一步分解,它们可以称为标量。相对的,如果一个数据可以继续分解,那它称为聚合量,Java中最典型的聚合量是对象。如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序真正执行的时候将可能不创建这个对象,而改为直接创建它的若干个被这个方法使用到的成员变量来代替。拆散后的变量便可以被单独分析与优化,可以
各自分别
在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间了。
6. 相关JVM参数
参数开启 :
在JDK 6u23以上是默认开启,这里将设置重新明确一下:
强制开启:-server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
关闭逃逸分析: -server -XX:-DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m
JVM原理 | 逃逸分析相关推荐
- 小师妹学JVM之:逃逸分析和TLAB
文章目录 简介 逃逸分析和栈上分配 TLAB简介 TLAB详解 设置TLAB空间的大小 TLAB中大对象的分配 TLAB空间中的浪费 总结 简介 逃逸分析我们在JDK14中JVM的性能优化一文中已经讲 ...
- JVM 之 逃逸分析和TLAB
来看一道面试题:所有的new 对象都是分配在堆上的吗?如果不是,是什么情况. 在没看到这道题目的时候,我对所有对象都分配在堆上的想法是没有一丝怀疑的,但是事实是不一定的. 逃逸分析 逃逸分析的定义 逃 ...
- JVM 逃逸分析 (史上最全)
对于JVM"逃逸分析" 特性,也是近年来大厂面试.高薪面试的常见面试题. 和逃逸分析有关的常见面试题: Java中的对象一定是在堆上分配的吗? 注:本文以 PDF 持续更新,最新尼 ...
- JVM虚拟机中优化技术之逃逸分析
目录 编译器优化技术之语言相关的优化技术 简介 前置问题 对象是否都被分配到了堆内存中? 为什么会发生逃逸? 什么是逃逸分析? 逃逸分析原理 什么是方法逃逸? 举例说明: 什么是线程逃逸? 举例说明: ...
- JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)
1.是什么 (1) 基本概念:可运行 Java 代码的非真实计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回器,堆和一个存储方法域.它运行在操作系统之上,与硬件没有直接的交互. (2) ...
- JVM内存模型、逃逸分析以及发生GC的时机
文章目录 1. 整体内存模型图 ①:堆 ②:栈与栈帧 ③:方法区 ④:程序计数器 ⑤:本地方法栈 2. JVM参数设置 GC日志打印参数设置 3. JVM内部的对象创建流程(new 对象流程) 4. ...
- JVM原理及GC优化
JVM的底层原理及GC优化 JVM的的主要组成及其作用 类的加载机制 JVM内存模型深度剖析与优化 JVM对象创建与内存分配机制 垃圾收集器及垃圾收集算法 垃圾收集器底层算法实现 字符串常量池 八种基 ...
- java标量替换_JAVA逃逸分析、栈上分配、标量替换、同步消除
一.逃逸分析 逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段.通过对象的作用范围的分析,为其他优化手段提供分析数据从而进行优化. 逃逸分析包括: 全局变量赋值逃逸 方法返回值逃逸 实例引用发 ...
- 逃逸分析和标量替换技术,你明白了吗
文章目录 逃逸分析 怎么做逃逸分析后的优化? 什么是线程分配缓冲TLAB? 什么是标量替换? 实战 开始逃逸分析(默认开启的) 关闭逃逸分析-XX:-DoEscapeAnalysis 逃逸分析 逃逸分 ...
最新文章
- DHTML【7】--CSS
- [ARM异常]-中断的术语介绍:target,assert,taken,acknowledge
- linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍df...
- 计算机网络(十)-数据链路层-差错控制
- 对不起,我把APP也给爬了
- 92030302随堂笔记 c# 1614675886
- python第六十天-----RabbitMQ
- javascript中的时间处理
- html切西瓜游戏源码,html5切水果源码(水果忍者)
- webgate 重构 工作进度计划
- 【C语言经典100题】求1~20阶乘的和
- Typora自制主题
- Matplotlib系列(一):快速绘图入门
- 小象学院python数据分析课程怎么样_小象学院的机器学习集训营课程怎么样?
- java微信扫一扫_java调用微信扫一扫
- 一个简单的音乐网站设计与实现(HTML+CSS)---爵士乐音乐 3页
- mel滤波matlab,MFCC(Mel Frequency Cepstral Coefficient)提取过程详解
- LR1语法分析C语言代码,LR1语法分析
- 逐梦offer -- JVM篇
- 629 will: 各种用法tyg
热门文章
- Java ApachePOI Excel 设置强制换行
- 关于microsoft Store被删除了重新下载的问题
- 深入浅出学Hive——Hive原理
- 华为不用bes2300_不考虑音质,华为freebuds3,OPPO W51和漫步者TWS NB2,降噪水平哪个好?...
- Reids系列: Redis主从复制 (四)
- 基于PHP的烘培甜品管理系统
- 从工厂妹到月入十万的微商:成长之路并非一帆风顺
- python 协程 async/await
- 责任链模式之Tomcat Filter应用
- 超硬核!花33小时来造台3D打印机吧~