DontInline、ForceInline等是JDK内部注解,不能应用于用户代码。即使您设法以某种方式打开了这些注释,HotSpot JVM 也有一个 explicit check 来禁止它们用于非特权类。
原因是可以理解的。这些注解是特定 JVM 版本的实现细节; JDK 开发人员可以在不另行通知的情况下随意添加/删除/更改此类注释的含义,即使是在 JDK 的小更新中。
无论如何,使用@DontInline 强制矢量化似乎不是一个好方法。一般来说,内联不应该阻止其他优化。如果您遇到此类问题,最好在hotspot-compiler-dev 邮件列表上报告问题。
现在好消息。
从 JDK 9 开始,有一个公共支持的 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 选项,它可能有助于向量化特定方法。