java逃逸分析,逃逸分析技术

2020-06-20 11:25栏目:编程
TAG: java

逃逸行为主要分为以下两类:
方法逃逸:当一个对象在方法里面被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,此时称为方法逃逸;
线程逃逸:当一个对象在方法里面被定义后,它可能被外部线程所访问,例如赋值给可以在其他线程中访问的实例变量,此时称为线程,其逃逸程度高于方法逃逸。
// 如果这个方法的sb被其他方法所引用或者作为参数所引用,则会分配在堆上,因为分配在栈上会随着栈帧的出栈而自动销毁。
java内存逃逸
如果能证明一个对象不会逃逸到方法或线程之外,或者逃逸程度比较低(只逃逸出方法而不会逃逸出线程),则可以为这个对象实例采取不同程序的优化:
 
栈上分配 (Stack Allocations):如果一个对象不会逃逸到线程外,那么将会在栈上分配内存来创建这个对象,而不是 Java 堆上,此时对象所占用的内存空间就会随着栈帧的出栈而销毁,从而可以减轻垃圾回收的压力。(也就是不会发生方法逃逸的对象可以直接在栈上分配,而不是在堆上,实际开发中建议尽量不要发生方法逃逸)

标量替换 (Scalar Replacement):如果一个数据已经无法再分解成为更小的数据类型,那么这些数据就称为标量(如 int、long 等数值类型及 reference 类型等);反之,如果一个数据可以继续分解,那它就被称为聚合量(如对象)。如果一个对象不会逃逸外方法外,那么就可以将其改为直接创建若干个被这个方法使用的成员变量来替代,从而减少内存占用。

同步消除 (Synchronization Elimination):如果一个变量不会逃逸出线程,那么对这个变量实施的同步措施就可以消除掉。

上一篇:
jvm常用的垃圾收集算法,垃圾收集算法分析
 

本文来自网络,不代表山斋月平台立场,转载请注明出处: https://www.shanzhaiyue.top