java - 如何使用 HotSpot JVM @DontInline 注解?

标签 java inline compiler-optimization jvm-hotspot

我目前正在优化一个特定的方法,不幸的是它被 JVM 内联,这会阻止它被正确地向量化。我注意到有一个注释禁止内联,即 jdk.internal.vm.annotation.DontInline .但是,不能从默认模块访问它。
是否有一种干净的方法可以访问此注释或以其他方式防止违规方法的内联?

最佳答案

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

现在好消息。
从 JDK 9 开始,有一个公共(public)支持的 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指令列表中的选项,这可能有助于向量化特定方法。

关于java - 如何使用 HotSpot JVM @DontInline 注解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66117877/

相关文章:

java - 在注释中注入(inject) Spring 属性列表

javascript - 内联 JavaScript 与 CSP 级别 1 结合使用

optimization - SIMD 指令降低 CPU 频率

java - 计时器加载另一个 Activity 需要多长时间

java - 警报对话框仅模糊部分屏幕

css - 将 Sprite 与内联列表一起使用

c++ - 内联一个操作堆上数据的函数

c++ - 寄存器分配后的持续传播

Swift:如何确保代码没有被优化掉?

java - java lambda 可以有超过 1 个参数吗?