我目前正在优化一种特定的方法,不幸的是,它被JVM内联,这导致无法进行适当的矢量化处理。 我注意到有一个禁止内联的注释,即jdk.internal.vm.annotation.DontInline
。 但是,它无法从默认模块访问。
有没有一种清洁的方法可以获得此注释的访问权限,或者以其他方式阻止有问题的方法内联?
我目前正在优化一种特定的方法,不幸的是,它被JVM内联,这导致无法进行适当的矢量化处理。 我注意到有一个禁止内联的注释,即jdk.internal.vm.annotation.DontInline
。 但是,它无法从默认模块访问。
有没有一种清洁的方法可以获得此注释的访问权限,或者以其他方式阻止有问题的方法内联?
DontInline
、ForceInline
等是JDK内部注解,不能应用于用户代码。即使您以某种方式管理打开这些注解,HotSpot JVM也会进行显式检查,禁止非特权类使用它们。
原因是可以理解的。这些注解是特定JVM版本的实现细节;JDK开发人员可以自由地增加/删除/更改此类注解的含义,甚至在JDK更新的次要版本中也可能如此。
使用@DontInline
来强制矢量化似乎不是一个好方法。通常情况下,内联不应阻止其他优化。如果遇到此类问题,最好在hotspot-compiler-dev邮件列表上报告问题。
-XX:CompilerDirectivesFile=<file>
选项启动 JVM。如果您的应用程序对某些编译器决策敏感,可以将指令文件与应用程序一起提供。{
match: "*::*",
inline: "-org/package/MyClass::hotMethod"
}
ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
"compilerDirectivesAdd",
new Object[]{new String[]{"compiler.json"}},
new String[]{"[Ljava.lang.String;"}
);
顺便提一下,指令列表中有一个 Vectorize: true
选项,可能有助于将特定方法向量化。
-XX:CompileCommand
和dontinline
。 - Holger