【问题标题】:How to use the HotSpot JVM @DontInline annotation?如何使用 HotSpot JVM @DontInline 注解?
【发布时间】:2021-05-13 00:26:21
【问题描述】:

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

是否有一种干净的方法可以访问此注释或以其他方式防止违规方法的内联?

【问题讨论】:

  • 是的,我知道该命令,但据我所知,它并不是真正可以推送到共享存储库的东西。
  • 您没有在问题中提到“可以推送到共享存储库的东西”的约束。除此之外,不清楚为什么你认为你不能。显然,还有更多你没有提到的限制。

标签: java inline compiler-optimization jvm-hotspot


【解决方案1】:

DontInlineForceInline等是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 选项,它可能有助于向量化特定方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多