"native" 关键字和@HotSpotIntrinsicCandidate 注解的区别

Difference between "native" keyword and @HotSpotIntrinsicCandidate annotation

为什么要一个一个地使用另一个,反之亦然? 哪个性能更好?

@HotSpotIntrinsicCandidate 注释的 javadoc 注释如下:

"The @HotSpotIntrinsicCandidate annotation is specific to the HotSpot Virtual Machine. It indicates that an annotated method may be (but is not guaranteed to be) intrinsified by the HotSpot VM. A method is intrinsified if the HotSpot VM replaces the annotated method with hand-written assembly and/or hand-written compiler IR -- a compiler intrinsic -- to improve performance. The @HotSpotIntrinsicCandidate annotation is internal to the Java libraries and is therefore not supposed to have any relevance for application code."

总之,有这个注解的方法1 可以特别优化,但要看HotSpot JVM是否知道如何优化它。言外之意就是:

  1. 如果 HotSpot JVM 知道如何将其内部化,Java 方法体将被忽略。
  2. 如果 HotSpot JVM 知道如何 intrisify,Java 方法体将以正常方式使用。
  3. 实现 JVM 代码以进行内在化并非易事。
  4. 您不能在自己的代码中使用它。 (它涉及修改核心 HotSpot JVM 代码库。)

相比之下,将方法声明为 native 告诉 JVM 它 必须 使用本机代码实现。 (native 方法没有主体。)方法的本机代码实现 可能 由 JVM 提供,或者它 可能 由动态加载的本机库或 DLL 提供。)调用通常1 通过 JNI / JNA 进行,其调用顺序将 less 比传统的 Java 方法调用更高效,当然还有一个复杂的方法调用。

1 - 其实在Java17.
中调用了注解@IntrinsicCandidate 2 - 核心 Java SE 类 中的某些 native 方法(例如 Object 方法)也被标记为内部方法。这些可能会得到优化的调用序列。


所以回答你的问题:

Which is more performative?

集成的方法调用会更高效。

Why use one over another and vice-versa?

  1. 您(普通 Java 程序员)不能有效地将应用程序中的方法标记为内部方法。常规和 native 方法是您唯一的选择。

  2. JVM 实现者有一个选择,但考虑到涉及的额外工作,他们往往只在方法会带来显着的性能优势时才使方法成为固有方法。例如,在 java.io.* 类 中内化 native 方法调用没有什么意义,因为与典型 [=] 中发生的其他事情相比,JNI 方法调用开销很小78=]操作。