JVM原理 | 逃逸分析
发布日期:2022-02-21 17:40:20 浏览次数:51 分类:技术文章

本文共 1774 字,大约阅读时间需要 5 分钟。

逃逸分析

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调优机制,

  1. 优化前 : 首先会在堆内存创建类的实例,然后将此对象的引用压入调用栈,继续执行
  2. 优化后 : 针对栈的重新分配方式,首先找出未逃逸的变量,将该变量直接存到栈里,无需进入堆,分配完成后,继续调用栈内执行,最后线程执行结束,栈空间被回收,局部变量也被回收了。如此操作,是优化前在堆中,优化后在栈中,从而减少了堆中对象的分配和销毁,从而优化性能。

总结: 不逃逸的对象, 只存在栈中, 减少了堆压力, 从而得到优化效果;

4. 逃逸的方式

  1. 方法逃逸: 在一个方法体内,定义一个局部变量,而它可能被外部方法引用,比如作为调用参数传递给方法,或作为对象直接返回。或者,可以理解成对象跳出了方法。
  2. 线程逃逸: 这个对象被其他线程访问到,比如赋值给了实例变量,并被其他线程访问到了。对象逃出了当前线程。

5. 逃逸分析的好处

如果一个对象不会在方法体内,或线程内发生逃逸(或者说是通过逃逸分析后,使其未能发生逃逸)

逃逸分析后的三大优点 :

  1. 栈上分配 : 一般情况下,不会逃逸的对象所占空间比较大,如果能使用栈上的空间,那么大量的对象将随方法的结束而销毁,减轻了GC压力

  2. 同步消除 : 如果你定义的类的方法上有同步锁,但在运行时,却只有一个线程在访问,此时逃逸分析后的机器码,会去掉同步锁运行。

  3. 标量替换 :

    Java虚拟机中的原始数据类型(int,long等数值类型以及reference类型等)都不能再进一步分解,它们可以称为标量。相对的,如果一个数据可以继续分解,那它称为聚合量,Java中最典型的聚合量是对象。

    如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序真正执行的时候将可能不创建这个对象,而改为直接创建它的若干个被这个方法使用到的成员变量来代替拆散后的变量便可以被单独分析与优化,可以各自分别在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间了。

6. 相关JVM参数

参数开启 :

在JDK 6u23以上是默认开启,这里将设置重新明确一下:

​ 强制开启:-server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m

​ 关闭逃逸分析:  -server -XX:-DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m

转载地址:https://blog.csdn.net/weixin_40597409/article/details/115260954 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql数据库 | MVCC
下一篇:mysql数据库 | 三大范式

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月12日 14时13分34秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章