如何使用 HotSpot JVM @DontInline 注解?

How to use the HotSpot JVM @DontInline annotation?

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

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

DontInlineForceInline等是JDK内部注解,不能应用于用户代码。即使您以某种方式设法打开这些注释,HotSpot JVM 也有一个 explicit check 禁止它们用于非特权 类.

原因是可以理解的。这些注解是特定 JVM 版本的实现细节; JDK 开发人员可以自由 add/remove/change 此类注释的含义,恕不另行通知,即使是在较小的 JDK 更新中。

使用@DontInline强制向量化似乎不是一个好的方法。通常,内联不应阻止其他优化。如果您遇到此类问题,最好在 hotspot-compiler-dev 邮件列表中报告问题。


好消息来了。

自 JDK 9 起,有一个 public 支持 API 来手动调整 JIT 编译器。这是 JEP 165: Compiler Control.

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

{
    match: "*::*",
    inline: "-org/package/MyClass::hotMethod"
}

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

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

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