zl程序教程

您现在的位置是:首页 >  工具

当前栏目

编译器中的 逃逸分析

编译器 分析 逃逸
2023-09-14 09:07:22 时间

逃逸分析

在计算机语言编译器语言优化管理中,分析指针动态范围的方法称之为逃逸分析。

通俗点讲,当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸。

public class G {
    public static B b;
    
    public void globalVariablePointerEscape(){//给全局变量赋值,发生逃逸
        b=new B();
    }
    
    public B methodPointerEscape(){//方法返回值,发生逃逸
        return new B();
    }
    
    public void instancePassPointerEscape(){
        methodPointerEscape().printClassName(this);//实例引用发生逃逸
    }
    
    
}

class B{
    public void printClassName(G g){
        System.out.println(g.getClass().getName());
    }
}

在这个例子中,一共举了3种常见的指针逃逸场景。分别是 全局变量赋值,方法返回值,实例引用传递。

逃逸分析优化JVM原理

我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针。

当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量较多,将给GC带来较大压力,也间接影响了应用的性能。减少临时对象在堆内分配的数量,无疑是最有效的优化方法。

怎么减少临时对象在堆内的分配数量呢?不可能不实例化对象吧&