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

2020-01-10  本文已影响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逃逸情况

上一篇下一篇

猜你喜欢

热点阅读