java - 为什么这个java代码不能使用逃逸分析?

标签 java jvm hotspot escape-analysis

我的代码在这里=>

class PointHolder {
    private Point point;

    public PointHolder(Point point) {
        this.point = point;
    }
    //getter
}
class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    //getter setter
}

public class Escape {
    public static void main(String[] args) {
        for (int i = 0; i < 20000; i++) {
            test4(i);
        }
    }
    static int foo;
    public static void test4(int x) {
        PointHolder pointHolder = new PointHolder(new Point(x + 2, 42));
        foo = pointHolder.getPoint().getX();
    }
}

使用 jitwatch,我可以看到 pointHolder 没有被分配,但是 new Point(x+2, 42) 仍然被分配。

ea

es2

我不明白为什么

最佳答案

HotSpot C2 编译器中的逃逸分析相当简单。它从不尝试检测所有 未脱离编译范围的可能对象。特别是,它目前不处理多级引用树。

在您的示例中,对新分配的 Point 的引用被分配给一个对象字段:PointHolder.point。 JIT 将此分配视为 Point 对象的转义,因此不会消除分配。

一个特殊的异常(exception)是装箱-拆箱:HotSpot 专门处理装箱-拆箱方法。例如。当分配给 IntegerHolder 字段时,它仍然能够消除 Integer 对象的分配。

不过,这个问题并不是无法解决的问题 - 它是一个错失的优化机会。 Graal JIT 在这方面更好 - 在给定的示例中,它确实消除了 PointPointHolder 分配。

关于java - 为什么这个java代码不能使用逃逸分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678340/

相关文章:

java - Spring Loading 问题 - 上下文配置位置

java - JUnit测试时出现运行时错误

java - 类型安全安装 : JDK not installed or found, 即使它们是

java - 即使启用了 NMT,为什么 JCMD 也会抛出 "native memory tracking is not enabled"消息?

jvm - Java HotSpot中内部方法的汇编实现代码在哪里?

java - 在数据库中搜索记录 "Java.lang.NullPointerExepton"

java - 无法从静态上下文引用 FindViewById

java - 启动 neo4j 时无法找到任何与版本 1.7 匹配的 jvms

powershell - Windows 10 iot 树莓派 3 wifi 热点

java - java中使用冒泡排序对字符串进行排序