温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JVM内存逃逸原理是什么

发布时间:2021-10-12 10:44:14 来源:亿速云 阅读:134 作者:iii 栏目:编程语言

本篇内容主要讲解“JVM内存逃逸原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JVM内存逃逸原理是什么”吧!

前提概要

JVM的内存分配主要在是运行时数据区(Runtime Data Areas),而运行时数据区又分为了:方法区,堆区,PC寄存器,Java虚拟机栈(就是栈区,官方文档还是叫Java虚拟机栈),本地方法区内存逃逸主要是对象的动态作用域的改变而引起的,故而内存逃逸的分析就是分析对象的动态作用域

方法逃逸

  • 什么是方法逃逸呢?举个栗子,在一个方法中定义一个对象后(方法内局部的),这个对象被外部方法引用,比如作为返回值返回传递到其他的地方,当这个方法执行结束要进行GC时,这个方法中的对象本应该被回收,却发现该对象还是存活状态没法回收,就称为方法逃逸

上代码

public static StringBuffer getStringBuffer(String str1,String str2) {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append(str1);
    stringBuffer.append(str2);
    return stringBuffer;
}

上面的代码中的stringBuffer虽然是方法内的局部变量因为stringBuffer被当作返回值返回,这样stringBuffer可能被其他的方法所改变,作用域就不仅仅在本方法内啦,这样就是逃逸到了方法外部。对的,就是越狱了。

  • 怎么样才能不让stringBuffer逃出方法呢?那么不直接返回stringBuffer对象不就可以了嘛!如下面的代码:

public static StringBuffer getStringBuffer(String str1,String str2) {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append(str1);
    stringBuffer.append(str2);
    return stringBuffer.toString();
}
  • 线程逃逸:上面的例子,直接将对象返回,该对象可能被外部线程访问,如:赋值给类变量等,称为线程逃逸。

总的来说就是一个对象的指针被多个方法或者线程引用时,我们就称这个对象的指针发生了逃逸。

优化:即证明一个对象不会逃逸到方法或线程外。

栈上分配:

在堆空间上进行内存分配,GC在堆空间上筛选可回收的对象,回收对象,整理内存都需要浪费时间,若能通过逃逸分析确定某些对象是一定不会逃逸出方法之外的,就可以直接让这个对象在栈上分配内存,该对象随方法的执行结束栈帧出栈而销毁,减轻了GC的压力。

同步消除:

线程同步本身比较耗时,若确定了一个变量不会逃逸出线程,无法被其他线程访问到,那这个变量的读写就不会存在竞争,这个变量的同步措施就可以清除掉。

标量替换:

  • 标量:Java中的原始数据类型(int,char,long等)都不能再进一步分解,他们就可以称为标量

  • 聚合量:若一个数据可以继续分解,那就称之为聚合量,而对象就是典型的聚合量

若逃逸分析证明一个对象不会逃逸出方法,不会被外部访问,并且这个对象是可以被分解的,那程序在真正执行的时候可能不创建这个对象,而是直接创建这个对象分解后的标量来代替。这样就无需在对对象分配空间了,只在栈上为分解出的变量分配内存即可。

All in all:

逃逸分析是比较耗时的,所以性能未必提升很多,因为其耗时性,采用的算法都是不那么准确但是时间压力相对较小的算法来完成的,这就可能导致效果不稳定,要慎用

由于HotSpot虚拟机目前的实现方法导致栈上分配实现起来比较复杂,所以HotSpot虚拟机中暂时还没有这项优化。OSR暂时未在Hotspot上执行实现。

相关的JVM参数:

-XX:+DoEscapeAnalysis 开启逃逸分析、 -XX:+PrintEscapeAnalysis 开启逃逸分析后,可通过此参数查看分析结果。

-XX:+EliminateAllocations 开启标量替换 -XX:+EliminateLocks 开启同步消除 -XX:+PrintEliminateAllocations 开启标量替换后,查看标量替换情况

到此,相信大家对“JVM内存逃逸原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI