JVM(六) - JIT的逃逸分析

一、JIT即时编译器 (Just In Time Compiler)

由于解释器在设计和实现上非常简单,且相当低效。为了解决这个问题,JVM提供了即时编译技术:即时编译可以将整个函数体编译成为机器码,有效到避免函数体被解释执行,而是重复执行时(即热点代码)直接执行编译后的机器码即可,大大提示了执行效率。

二、JIT的逃逸分析(Escape Analysis)

逃逸分析是一种代码分析手段,动态分析创建对象的使用范围

1、内存逃逸

如果一个在方法中创建的对象 ,除了在方法体中还有方法外部的引用,那么在方法执行完之后,由于对象仍有被引用,所以 GC 有可能是无法立即回收的,此现象则是对象发生了逃逸。可以简单理解一个对象并不只存活在一个方法的作用域内

逸行为的情况有两种:方法逃逸线程逃逸

  • 方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中;
  • 线程逃逸:如类变量或实例变量,或方法返回对象,可能被其它线程访问到;
public class EscapeAnalysis {

    public static Object a;

    public Object b;

    public void globalVariableEscape(){
        a = new Object();  // 静态变量,外部线程可见,会发生逃逸
    }

    public void instanceObjectEscape(){
        b = new Object();  // 赋值给堆中实例字段,外部线程可见,会发生逃逸
    }

    public Object returnObjectEscape(){
        return new Object();   // 返回实例,外部线程可见,会发生逃逸
    }

    public void noEscape(){
        Object noEscape = new Object();   // 仅创建线程可见,对象无逃逸
    }
}

2、逃逸分析的作用

筛选出没有发生逃逸的对象,为其它优化手段如栈上分配、标量替换和同步消除等提供依据

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值