JVM技术总结之五——JVM逃逸分析

时间:2022-07-22
本文章向大家介绍JVM技术总结之五——JVM逃逸分析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

接上篇《JVM技术总结之四——JVM内存结构》

五. JVM 逃逸分析

参考地址:《JVM的逃逸分析》

5.1 逃逸的定义

一个对象(或变量)在方法中处理完毕返回时,返回结果可能会被其他对象引用,或者全局引用,这种现象即为逃逸。或者可以说,一个对象指针被多个线程或方法引用时,该对象指针就是逃逸状态。

public StringBuilder escapeDemo1(String a, String b) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(a);
    stringBuilder.append(b);
    return stringBuilder;
}

上述代码中,StringBuilder 在方法中是局部的,但返回时可能会有多个线程或方法引用 StringBuilder,这时就构成了逃逸。如果要改为非逃逸情况,则应该返回 String,最后 return stringBuilder.toString()

5.2 逃逸分析的优化及原理

方法栈上对象的调用,正常情况下应该是栈向 Java 堆中查找对象的引用,然后从堆中加载该对象到栈中,直到方法结束。 逃逸分析的优化:不会将对象放到 Java 堆中,而是直接放到了栈中,此时该对象在栈中属于局部变量,不会发生逃逸。而且随着方法执行完毕,栈内存被回收,局部变量也回收了,这样也变相的减轻了 GC 的压力。

注:栈上分配与 TLAB 不同。栈上分配是直接在虚拟机栈中分配了内存,TLAB 是在堆中为线程特别开辟的一块小空间,为了给这个线程更高效的分配对象。

5.3 逃逸分析适用范围

由于栈空间一般小,无法存储大容量数据,所以目前的实现都是采用不那么准确,但是时间压力相对较小的算法来完成逃逸分析,可能导致效果不稳定。逃逸分析的效果只能在满足高频和高数量小容量的变量分配结构,才是合适的。