如何使用HotSpot JVM @DontInline注释?



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

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

DontInlineForceInline等为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"
}

甚至可以在运行时使用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选项,这可能有助于向量化特定的方法。

最新更新