java对象只在堆中分配吗?对象逃逸分析

逃逸分析:
逃逸分析的基本行为就是分析对象动态作用域,当一个对象在方法中被定义后,可能会被外部方法所引用,比如方法调用,也有可能被其他线程访问,比如类变量,这两种情况分别叫做对象的方法逃逸和线程逃逸
如果虚拟机通过分析得出对象不会存在方法逃逸或者线程逃逸,则可以进而采取下面几种优化措施:
同步消除:同步操作是一个耗时的过程,如果确定一个变量不会发生线程逃逸,也就是不会被其他线程访问到,那对于这个变量的同步操作就会被去除
栈上分配:对象在堆中分配,在堆中被标记回收这是大家熟知的,而回收和整理内存都需要消耗CPU,如果确定一个对象不会发生方法逃逸,考虑直接在栈帧中为该对象分配空间而不是在堆中会是一个很好地主意,由于绝大部分对象都不会逃逸,这样在方法退出时对象内存即可被回收,垃圾收集系统的压力会小很多
标量替换:标量是指一个数据已经不能用更小的数据来表示了,java中的基本类型以及String都属于标量,与此对应的可以被分解的就叫做聚合量,java中对象就是典型的聚合量,如果确定对象不会逃逸,并且对象可以被分解,那么使用时可能不会创建对象,而是只在栈中创建对象中被使用到的标量
栈上分配和标量替换这两种技术让对象在堆中分配变得不再绝对,也可以大大减轻虚拟机负担,但逃逸分析技术目前依然不太成熟,有很大的优化空间,尽管如此,逃逸分析是即时编译器优化技术的一个重要方向,今后的虚拟机技术中,逃逸分析一定会支撑起一系列实用有效的优化技术

猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/80717221