调用声明为的Java方法时,JVM运行时必须执行哪些常规步骤native?
native
HotSpot 1.8.0 JVM如何实现JNI函数调用?涉及哪些检查步骤(例如,返回后未处理的异常?),JVM要执行哪些簿记操作(例如,本地引用注册表?),并且在调用本机Java方法之后控件将移至何处?如果有人可以提供本机HotSpot 1.8.0代码的入口点或重要方法,我也将不胜感激。
免责声明:我知道我自己可以阅读代码,但事先的解释有助于快速找到代码的方式。此外,我发现这个问题值得Google搜索。;)
与简单的C函数调用相比,从Java调用JNI方法非常昂贵。HotSpot通常执行以下大多数步骤来调用JNI方法:
JNIEnv*
jclass
method_entry
synchronized
in_java
in_native
method_exit
该过程的源代码可以在SharedRuntime :: generate_native_wrapper中找到。
如您所见,开销可能很大。但是在许多情况下,上述大多数步骤都是不必要的。例如,如果本机方法仅对字节数组执行一些编码/解码,并且不引发任何异常,也不调用其他JNI函数。对于这些情况,HotSpot具有称为的非标准(且未知)约定CriticalNatives
CriticalNatives