读深入理解JVM之-什么是逃逸分析

开门见山 解决问题


逃逸分析(Escape Analysis)本质上是JVM(以下的JVM均代表Hotspot虚拟机)即时编译器(JIT)的一种分析对象作用域的算法,或者可以称之为是一种用于优化JVM的分析技术。逃逸分析不是直接用来优化代码的技术,它为JVM编译器其他优化技术提供必要的分析依据。逃逸分析的基本行为 —— 分析对象作用域。

何为逃逸?

逃逸分为两种:方法逃逸和线程逃逸。

  • 方法逃逸:一个对象在方法内被new后,被外部方法所引用,例如作为参数传递到外部方法,这样此对象发生了逃逸。
  • 线程逃逸:一个对象在方法内被new后,被外部线程访问,例如赋值给类变量或直接被其他线程访问,这样此对象发生了逃逸。
举个例子
public static StringBuffer craeteStringBuffer(String s1, String s2) {
    StringBuffer sb = new StringBuffer();
    sb.append(s1);
    sb.append(s2);
    return sb;
}

如上段代码,对象sb就发生了逃逸。

public static String createStringBuffer(String s1, String s2) {
    StringBuffer sb = new StringBuffer();
    sb.append(s1);
    sb.append(s2);
    return sb.toString();
}

如上段代码,对象sb没有发生逃逸。因为返回的是值为

getClass().getName() + '@' + Integer.toHexString(hashCode())

字符串

既然有了逃逸分析作为依据,对这个对象就可以进行一些高效的优化。

  • 栈上分配(Stack Allocation):让对象分配在栈上,对象所占用的空间随着栈帧出栈而释放,这样能给GC减轻不少的压力。
  • 同步消除(Synchrogazation Elimination):又叫锁消除或同步省略。当确认一个对象不会发生线程逃逸,那么就可以消除耗时的线程同步过程。
  • 标量替换(Scalar Replace):指把一个对象替换为若干基本数据类型来访问。Java中标量指的是类似于int、long及reference等不能再进一步分解的数据类型。相对的,可以再分解的数据类型称为聚合量(Aggregate)也就是最常见的对象。有的对象可能不需要在堆上分配作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是被创建成一个个局部变量在存储在栈上(栈上分配),这样大概率会被分配在CPU高速寄存器中,也为之后的优化提供了条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值