我目前正在优化一个特定的方法,不幸的是它被JVM内联了,这阻止了它被正确地矢量化。我注意到有一个注释禁止内联,即jdk.internal.vm.annotation.DontInline
。但是,它不能从默认模块访问。
是否有一种干净的方法可以访问这个注释,或者以其他方式防止内联有问题的方法?
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"
}
甚至可以在运行时使用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
选项,这可能有助于向量化特定的方法。