Fork me on GitHub

【JVM】逃逸分析

逃逸分析

逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。

如果能证明一个对象不会逃逸到方法或线程外,则可能为这个变量进行一些高效的优化。

栈上分配

如果能够通过逃逸分析确定某些对象不会逃出方法之外,那就可以让这个对象在栈上分配内存,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,减轻了垃圾回收的压力。

同步消除

线程同步本身是一个相对耗时的过程,如果逃逸分析能确定一个变量不会逃逸出线程,无法被其他线程访问,那么这个变量就不会有读写竞争,对这个变量实施的同步措施也就可以消除掉

标量替换

  • 标量:数据不能进一步分解,如原始数据类型(int,long等数值类型以及reference类型等)
  • 聚合量: 数据可以继续分解,如对象

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

参考资料

《深入理解Java虚拟机》