"native"关键字和@HotSpotIntrinsicCandidate注释之间的区别



为什么要使用一个而不是另一个?哪个更具表演性?

@HotSpotIntrinsicCandidate注释的javadoc注释如下所示:

"@HotSpotIntrinsicCandidate注释特定于HotSpot虚拟机。它表示带注释的方法可能(但不能保证(被HotSpot VM内部化。如果HotSpot VM用手工编写的程序集和/或手工编写的编译器IR(编译器的固有特性(来替换带注释的方法,则方法是内部化的。@HotSpotIntrinsicCandidate注释是Java库内部的,因此不应该与应用程序代码有任何相关性">

简而言之,带有此注释的方法1可能会被特别优化,但这取决于HotSpot JVM是否知道如何优化它

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

相反,将方法声明为native,这会告诉JVM它必须使用本机代码实现。(native方法没有正文。(该方法的本机代码实现可能由JVM提供,也可能由动态加载的本机库或DLL提供。(该调用通常通过JNI/JNA进行1,其调用序列的性能将比传统Java方法调用(当然是内部方法调用(低

1-事实上,注释在Java 17中被称为@IntrinsicCandidate
2-核心Java SE类中的一些native方法(例如Object方法(也被标记为内在方法。这些可以得到优化的调用序列


因此,回答您的问题:

哪个更具表演性?

复杂的方法调用将具有更高的性能。

为什么使用一个而不是另一个?

  1. 您(一个普通的Java程序员(无法有效地将应用程序中的方法标记为内在方法。Regular和native方法是您唯一的选择。

  2. JVM实现者有一个选择,但考虑到所涉及的额外工作,他们倾向于只在方法具有显著性能优势时才使其成为内在方法。例如,在java.io.*类中内部化native方法调用是没有意义的,因为与典型I/O操作中发生的其他事情相比,JNI方法调用开销将很小。

最新更新