栈上分配与逃逸分析

一、逃逸分析

当一个对象在方法中被定义后,它有两种可能

  1. 被外部方法所引用:作为调用参数传递给其他方法,称为方法逃逸
  2. 被外部线程所引用:赋值给可以在其他线程中访问的实例变量,称为线程逃逸

如果能证明一个对象不会逃逸到方法或线程外,或者逃逸程度较低,则可以采取不同程度的优化

 

二、栈上分配

如果确定一个对象不会逃逸出线程,那让该对象在栈上分配内存是个不错主意,对象所占用内存空间就可随栈帧出栈而销毁。

 

三、标量替换

标量:若一个数据已经无法再分解成更小数据来表示,JVM中基础数据类型都不能再进一步分解,这些数据可被称为标量。

聚合量:如果一个数据可以继续分解,那它就被称为聚合量。

其中Java对象是典型的聚合量,我们将Java对象拆散,根据程序访问的情况,将其用到的成员变量恢复为原始类型来访问,如果证明一个对象不会被外部方法所引用,并且该对象可以分解,那么这个对象就不会被创建。

 

四、同步消除

如果逃逸分析确定一个变量不会逃逸出线程,那么它的读写肯定不会有竞争,所以对它加的安全限制,例如锁,就湖北安全消除

 

posted @ 2023-03-19 17:10  冬日寻雾记  阅读(119)  评论(0)    收藏  举报