如何使用 HotSpot JVM @DontInline 注解?

Nic*_*tte 3 java inline jvm-hotspot compiler-optimization

我目前正在优化一个特定的方法,不幸的是它被 JVM 内联,这会阻止它被正确地向量化。我注意到有一个禁止内联的注释,即jdk.internal.vm.annotation.DontInline. 但是,无法从默认模块访问它。

是否有一种干净的方法可以访问此注释或以其他方式防止内联有问题的方法?

apa*_*gin 5

DontInline, ForceInline, 等是 JDK 内部注释,它们不能应用于用户代码。即使您以某种方式设法打开这些注释,HotSpot JVM 也会进行显式检查以禁止非特权类使用它们。

原因是可以理解的。这些注释是特定 JVM 版本的实现细节;JDK 开发人员可以在不通知的情况下随意添加/删除/更改此类注释的含义,即使在较小的 JDK 更新中也是如此。

@DontInline无论如何,使用强制矢量化似乎不是一个好方法。一般来说,内联不应该阻止其他优化。如果您遇到此类问题,最好在hotspot-compiler-dev邮件列表上报告问题。


现在是好消息。

从 JDK 9 开始,有一个公共支持的 API 来手动调整 JIT 编译器。这是JEP 165:编译器控制

这个想法是在单独的 JSON 文件中提供编译器指令,并使用-XX:CompilerDirectivesFile=<file>选项启动 JVM 。如果您的应用程序对某些编译器决策敏感,您可以随应用程序一起提供指令文件。

{
    match: "*::*",
    inline: "-org/package/MyClass::hotMethod"
}
Run Code Online (Sandbox Code Playgroud)

甚至可以使用 DiagnosticCommand API 在运行时以编程方式应用编译器指令:

ManagementFactory.getPlatformMBeanServer().invoke(
        new ObjectName("com.sun.management:type=DiagnosticCommand"),
        "compilerDirectivesAdd",
        new Object[]{new String[]{"compiler.json"}},
        new String[]{"[Ljava.lang.String;"}
);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,Vectorize: true指令列表中有一个选项,这可能有助于向量化特定方法。