JVM(六) - JIT的逃逸分析

本文详细介绍了JVM中的JIT即时编译器和逃逸分析,包括内存逃逸、同步消除、标量替换和栈上分配等概念。逃逸分析能够帮助优化性能,例如通过锁消除和标量替换减少内存占用和提高执行效率。通过测试逃逸分析的开启和关闭,展示了其对代码执行效率的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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、逃逸分析的作用

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

JVM相关参数配置:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值