JVM逃逸分析

逃逸分析

(1)逃逸分析: 当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。

(2)使用逃逸分析,JIT编译器可以对代码优化:

​ 1)同步省略: 如果一个同步代码块中的对象被加了锁,但这个对象只在方法中定义并调用,没有逃逸,那么JIT编译器会把同步代码 块变成正常的代码块,这就叫同步省略,又叫锁消除

​ 例如:

public void f() {
    Object hollis = new Object();
    synchronized(hollis) {
        System.out.println(hollis);
    }
}

​ hollis 对象的作用域只在f() 方法中,所以会被优化成:

public void f() {
    Object hollis = new Object();
    System.out.println(hollis);
}

​ 2)标量替换: 标量(Scalar)是指一个无法再分解成更小的数据的数据。Java中的原始数据类型就是标量。相对的,那些还可以分 解的数据叫做聚合量(Aggregate),Java中的对象就是聚合量,因为他可以分解成其他聚合量和标量。在JIT阶段,如果经过逃 逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。这个过程就是标量替换。

​ 例如:

public static void main(String[] args) {
   alloc();
}

private static void alloc() {
   Point point = new Point1,2;
   System.out.println("point.x="+point.x+"; point.y="+point.y);
}
class Point{
    private int x;
    private int y;
}

​ 被优化成:

private static void alloc() {
   int x = 1;
   int y = 2;
   System.out.println("point.x="+x+"; point.y="+y);
}
栈上分配

如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。

其实在现有的虚拟机中,并没有真正的实现栈上分配,但也没有在堆上分配,其实是标量替换实现的。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JVM 逃逸分析(Escape Analysis)是一种用于分析 Java 代码中对象的作用域的技术。它可以帮助 JVM 在运行时确定对象的作用域,从而优化代码的性能。 在 Java 中,对象的生命周期是由它的作用域决定的。如果一个对象在方法内部创建并且只在该方法中使用,那么它的作用域就被限制在了该方法内部。这种对象被称为局部对象(Local Object)。如果一个对象在方法内部创建但是在方法外部被引用,那么它的作用域就被扩展到了方法外部。这种对象被称为逃逸对象(Escape Object)。 JVM 逃逸分析就是用来分析对象的作用域的。通过对代码的分析,JVM 可以确定哪些对象是局部对象,哪些对象是逃逸对象。对于局部对象,JVM 可以在栈上分配内存,这样可以避免在堆上分配内存的开销,从而提高代码的性能。对于逃逸对象,JVM 则必须在堆上分配内存。 JVM 逃逸分析对于代码性能的影响非常大。如果一个方法中大量使用逃逸对象,那么 JVM 将不得不频繁地在堆上分配内存,这将影响代码的性能。但是如果一个方法中大量使用局部对象,那么 JVM 可以将这些对象分配到栈上,从而避免在堆上分配内存的开销,这将大大提高代码的性能。 总之,JVM 逃逸分析是一种非常重要的技术,它可以帮助 JVM 在运行时优化代码的性能,提高代码的执行效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值