如何使用HotSpot JVM的@DontInline注解?

4

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

有没有一种清洁的方法可以获得此注释的访问权限,或者以其他方式阻止有问题的方法内联?


1
请参阅-XX:CompileCommanddontinline - Holger
是的,我知道那个命令,但据我所知,它并不是你可以推送到共享存储库的东西。 - Nicolas Heutte
2
你在问题中没有提到“可以推送到共享存储库的内容”这个限制。除此之外,不清楚你为什么认为自己不能这样做。显然,还有更多你没有提到的限制。 - Holger
1个回答

6

DontInlineForceInline等是JDK内部注解,不能应用于用户代码。即使您以某种方式管理打开这些注解,HotSpot JVM也会进行显式检查,禁止非特权类使用它们。

原因是可以理解的。这些注解是特定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 选项,可能有助于将特定方法向量化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接