JVM逃逸分析 - JVM优化技术

版权声明:转载请标明出处 https://blog.csdn.net/weixin_36759405/article/details/83104394

概念

逃逸分析,是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。

在计算机语言编译器优化原理中,逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分析和外形分析相关联。当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他过程或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。

简单的概括下,逃逸分析的基本行为就是分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。

实例

方法逃逸的几种方式:

public class EscapeTest {
    public static Object obj;
    public void globalVariableEscape() {  // 给全局变量赋值,发生逃逸
        obj = new Object();
    }
    public Object methodEscape() {  // 方法返回值,发生逃逸
        return new Object();
    }
    public void instanceEscape() {  // 实例引用发生逃逸
        test(this); 
    }
}

优化技术

栈上分配
如果能够通过逃逸分析确定对象不会被外部访问到,可以将该对象在栈上分配内存。栈上分配就是把方法中的变量和对象分配到栈上,方法执行完后自动销毁,而不需要垃圾回收的介入,从而提高系统性能。

同步消除
线程同步本身比较耗时,如果确定一个对象不会逃逸出线程,无法被其它线程访问到,那该对象的读写就不会存在竞争。单线程中是没有锁竞争。(锁和锁块内的对象不会逃逸出线程就可以把这个同步块取消)

标量替换
原始数据类型(int,long等数值类型以及reference类型等)称为标量,创建对象时通过创建某方法使用到的成员变量来代替。

逃逸分析对性能的影响可参考 深入分析JVM逃逸分析对性能的影响

猜你喜欢

转载自blog.csdn.net/weixin_36759405/article/details/83104394