什么是逃逸分析【JVM】

介绍

逃逸分析是Java HotSpot Server编译器中JIT优化的一个重要步骤。它在Java SE 6u23及以后的版本中默认启用。
对象基于逃逸分析可以有三种状态:全局逃逸、参数逃逸和无逃逸。

  1. 全局逃逸:对象超出了方法或线程的范围,比如被存储在静态字段或作为方法的返回值。
public class A{
	private static Object staticObject;
	public void globalEscape(){
		staticObject = new Object(); // 这个对象赋值给静态变量,因此是全局逃逸的
	}
}
public static StringBuffer A(String s1,String s2){
	StringBuffer sb = new StringBuffer();
	sb.append(s1);
	sb.append(s2);
	return sb; // 也是全局逃逸的
}
  1. 参数逃逸:对象被作为参数传递或被参数引用,但在方法调用期间不会全局逃逸。
public class A{
	public void methodA(){
		Object localObject = new Object(); 
		methodB(localObject);
	}
	public void methodB(Object param){
	}
}

传递到methodB方法中的param对象就发生了参数逃逸。

  1. 无逃逸:对象可以被标量进行替换,意味着它的内存分配可以从生成的代码中移除。
public static String A(String s1,String s2){
	StringBuffer sb = new StringBuffer();
	sb.append(s1);
	sb.append(s2);
	return sb.toString();
}

不同的逃逸状态影响JIT(即时编译器)的优化策略:

  1. 全局逃逸: 由于对象可能被多个线程访问,全局逃逸的对象一般不适合进行栈上分配或其他内存优化。但JIT可能会进行其他类型的优化,如方法内联或循环优化。
  2. **参数逃逸:**这种情况下,对象虽然作为参数传递,但不会被方法外部的代码使用。JIT可以对这些对象进行一些优化,例如锁消除。
  3. 无逃逸::这是最适合优化的情况。JT可以采取多种优化措施,如在栈上分配内存,消除锁甚至完全消除对象分配(标量替换)。这些优化可以显著提高性能,减少垃圾收集的压力。

补充

什么是标量替换?

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

public static void main(String[] args){
	alloc();
}
private static void alloc(){
	Point point = new Point(1,2);
}

比如point对象没有逃逸出alloc方法,并且point对象是可以进行拆解成标量的,那么JIT就不会直接创建Point对象,而是直接用int x int y代替Point对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值