java - JVM 非内联方法优化

标签 java jvm jit

我基本上知道 JVM 内联方法后可以做的一些事情,例如标量替换转义分析lock elision 等(我承认我不知道所有这些)。但是如果方法太大而无法内联怎么办? JVM 可以对这些方法进行优化吗?我认为循环展开将是一个......

任何了解这个主题的人都可以提供一些线索吗?

最佳答案

内联是一种 super 优化,它拓宽了许多其他优化的范围:公共(public)子表达式消除、常量传播、标量替换等。 非内联方法是一个黑匣子 - JVM 不知道该方法是否修改对象字段、抛出异常、注册它是否破坏等等。

内联有助于其他优化,但这并不意味着没有内联其他优化就无法工作。 JIT编译单元是一个方法,JVM可以将几乎所有优化应用于其范围内的大非内联方法。想象一下,您通过在源代码中手动内联所有被调用者来创建一个非常大的方法。因此,无论内联是手动完成还是自动完成,结果控制流/数据流图都将大致相同,因此 JIT 将能够处理这两种情况。

特别是,逃逸分析可以在大方法中完美运行;如果分配和锁不逃逸此方法,仍然可以消除它们。

让我用以下 JMH 基准测试来演示这一点。使用 -prof gc 运行它,以确保在内联和非内联情况下都没有分配对象。

@State(Scope.Benchmark)
public class Inline {
    double x = 111;
    double y = 222;

    @Benchmark
    public double inline() {
        return doInline(x, y);

    }

    @Benchmark
    public double noinline() {
        return dontInline(x, y);
    }

    @CompilerControl(CompilerControl.Mode.INLINE)
    private double doInline(double a, double b) {
        return new Vector2D(a, b).norm();
    }

    @CompilerControl(CompilerControl.Mode.DONT_INLINE)
    private double dontInline(double a, double b) {
        return new Vector2D(a, b).norm();
    }

    static class Vector2D {
        private final double x;
        private final double y;

        public Vector2D(double x, double y) {
            this.x = x;
            this.y = y;
        }

        public double norm() {
            return Math.sqrt(x * x + y * y);
        }
    }
}

在 HotSpot 中进行标量替换的一个明显要求是对象构造函数及其所有调用的方法都是内联的,但调用者本身不需要内联。

关于java - JVM 非内联方法优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427394/

相关文章:

java - JVM 是否在其内存中存储了完整的字节码?

c++ - 我可以在 Windows RT 和 Windows Phone 8 上使用 JBT 编译代码吗

java - Eclipse 2.0.2 和 Maven 0.17 配置

java - 使用线程池创建一个等待来自客户端的消息的java服务器套接字

java - Struts 2 中重定向到另一个参数数量未知的操作

Elasticsearch 服务在数据插入 jvm 堆时挂起并终止

java - 如何查看 JVM 内部(?)。我可以在工作应用程序中分析方法、参数、返回值等吗?

ios - 系统.ExecutionEngineException : Attempting to JIT compile method only in Debug Mode on device (MonoTouch)

java - 为什么 Java 的 JIT 编译器不将所有内容都翻译成本地代码?

java - 在 Eclipse 中升级到新的云工具插件后,本地服务器显示 "stopping, synchronized."