美文网首页
《白话》---jvm引用逃逸

《白话》---jvm引用逃逸

作者: 故事细腻言不由己 | 来源:发表于2020-01-10 11:53 被阅读0次

参考:

https://cloud.tencent.com/developer/article/1509584

https://time.geekbang.org/column/article/18048

什么是引用逃逸?

当一个对象是在方法A中定义,那么正常来讲,他会在方法A结束就会被回收。

但是当它把自己的引用当做参数传入另一个一个方法B中,如果方法B生命周期很长,那么就造成了对象无法被释放的情况,称作引用逃逸。

这样就会导致临时对象无法被回收,造成JVM内存占用,严重的会发生FULL GC 从而影响性能。

什么是逃逸分析?

它是java虚拟机的分析技术,通过动态分析代码的作用域。判断这个对象有没有逃逸。

一般来说,逃逸分析的判断依据有2个:

1.是否被存入堆中

2.是否作为方法调用的调用者或者参数

逃逸分析可以做哪些事?

它作为一个衡量标准,可以判断对象是否逃逸,那么没有逃逸的对象,我们就可以做一些技术优化,诸如 《标量替换》 《同步消除》 《栈上分配》等。

什么是标量替换?

标量是指一个无法再分解成其他更小数据的数据,比如Java中基本数据类型和Reference类型.对应的就是聚合量,可以继续分解其数据,如Java的对象.而标量替换就是把Java对象访问导的成员变量作为局部变量直接使用,而不再创建对象.就是说,jvm会挑选用到这个对象中的一些属性,而不是用全部。

标量替换可以通过JVM 参数 -XX:+EliminateAllocations开启, 用-XX:+PrintEliminateAllocations查看替换情况.

什么是栈上分配?

栈上分配技术就是让这个没有逃逸出方法的对象在栈上分配内存空间,并且随着栈帧出栈而销毁.当应用存在大量不会逃逸的局部对象时,如果使用栈上分配技术,那么大量对象就可以随着方法结束而销毁,从而减轻了垃圾收集器的工作. 但Hotspot并没有实现真正意义上的栈上分配,实际上是标量替换.

什么是同步消除?

在能确定一个变量不会被其他线程访问,即不存在读写竞争的情况下,JVM就会对这个变量消除掉原有对这个变量的同步操作,可以通过-XX:+EliminateLocks可以开启同步消除.

部分逃逸

Graal中引入了控制流的逃逸分析。可以对有程序判断逃逸的分析。比如有if else逃逸情况

相关文章

  • 《白话》---jvm引用逃逸

    参考: https://cloud.tencent.com/developer/article/1509584 h...

  • Jvm优化技术

    Jvm优化技术有:逃逸分析、方法内联 一:Jvm优化技术之逃逸分析 1:概念 JVM的优化技术,可以有效减少Jav...

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

    简介 逃逸分析我们在JDK14中JVM的性能优化一文中已经讲过了,逃逸分析的结果就是JVM会在栈上分配对象,从而提...

  • this引用逃逸问题

    所谓this逃逸就是说,在类的构造方法还没执行完之前,其他线程就获得了this的引用并且去干一些事情,但是这时的对...

  • 在金三银四的跳槽季中 你可能缺这一份JVM性能调优总结

    JVM调优配置 -server JVM运行的模式之一, server模式才能进行逃逸分析, JVM运行的模式还有m...

  • JVM内存逃逸

    逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。 逃逸分析的基本行为就是分析对...

  • jvm逃逸分析

    首先先看一个问题,对象是否都被分配到了堆内存中? 众所周知java中对象都默认被分配到堆中,在栈中,只保存了对象的...

  • 再清楚不过了,JVM逃逸分析,你一定得知道

    提到JVM,相信大家一定知道JVM是什么?但是,提到逃逸分析,相信大多数人都可能一脸懵逼,逃逸分析到底是什么呢?接...

  • Java JVM 逃逸分析

    前言 最近在学习多线程这块内容的时候,了解到了JVM的逃逸分析,现在就简单地记录下。逃逸分析(Escape Ana...

  • JVM学习路线

    本人是java小白,想学习JVM知识,在网上有幸搜到了大神总结的白话教程,在这里分享给大家一起学习白话JVM

网友评论

      本文标题:《白话》---jvm引用逃逸

      本文链接:https://www.haomeiwen.com/subject/ldppactx.html