当前位置: 首页 > 面试题库 >

调用本地方法时,JVM必须做什么?

裴弘
2023-03-14
问题内容

调用声明为的Java方法时,JVM运行时必须执行哪些常规步骤native

HotSpot 1.8.0
JVM如何实现JNI函数调用?涉及哪些检查步骤(例如,返回后未处理的异常?),JVM要执行哪些簿记操作(例如,本地引用注册表?),并且在调用本机Java方法之后控件将移至何处?如果有人可以提供本机HotSpot
1.8.0代码的入口点或重要方法,我也将不胜感激。

免责声明:我知道我自己可以阅读代码,但事先的解释有助于快速找到代码的方式。此外,我发现这个问题值得Google搜索。;)


问题答案:

与简单的C函数调用相比,从Java调用JNI方法非常昂贵。HotSpot通常执行以下大多数步骤来调用JNI方法:

  1. 创建一个堆栈框架。
  2. 根据ABI将参数移至正确的寄存器或堆栈位置。
  3. 将对象引用包装到JNI句柄。
  4. 获取JNIEnv*jclass获取静态方法,并将其作为附加参数传递。
  5. 检查是否应调用method_entry跟踪功能。
  6. 如果方法为,则锁定对象监视器synchronized
  7. 检查本机功能是否已链接。功能查找和链接是延迟执行的。
  8. 将线程从切换in_javain_native状态。
  9. 调用本机函数
  10. 检查是否需要安全点。
  11. 使线程返回in_java状态。
  12. 如果锁定,则解锁监视器。
  13. 通知method_exit
  14. 解开对象结果并重置JNI句柄块。
  15. 处理JNI异常。
  16. 卸下堆栈框架。

该过程的源代码可以在SharedRuntime ::
generate_native_wrapper中
找到。

如您所见,开销可能很大。但是在许多情况下,上述大多数步骤都是不必要的。例如,如果本机方法仅对字节数组执行一些编码/解码,并且不引发任何异常,也不调用其他JNI函数。对于这些情况,HotSpot具有称为的非标准(且未知)约定CriticalNatives



 类似资料:
  • 问题内容: 每个人都告诉我“使用super.viewDidLoad()因为它就是这样”或“我一直那样做,所以要保留它”,“如果不叫super就是错误的”等。 我只发现了一些有关Objective-C用例的主题,这些主题并没有那么启发性,但是我正在Swift 3中进行开发,所以有什么专家可以给我一个很好的详细解释吗? 这是一种良好实践的案例还是有任何隐藏的影响? 问题答案: 通常,最好为您覆盖的所有

  • 主要内容:本地方法,为什么要使用Native Method,现状本地方法 简单来讲,一个Native Method就是一个java滴啊用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。 在定义一个native method时,并不提供实现体(有些像

  • 问题内容: 方法getText()必须从UI线程调用,请提供帮助。我是android studio的初学者,可以在网上找到这些代码,但无法弄清楚,我真的很感激。 问题答案: 在其UI线程而非后台线程中获取值。

  • 问题内容: 我有一个BaseActivity,其他所有活动都可以对其进行扩展。关键是,每当用户离开活动时,我都会将音乐静音。我也停止听电话。 问题是,只要用户在活动之间进行切换,就会被调用,这意味着该应用程序不必要地静音和停止,即使仅当用户离开该应用程序时该静音也应该停止。 现在说我在和之间切换。即使我只想 在用户离开应用程序时* 被调用,此开关也 不必要 执行。我该怎么办? * 感谢您的专家意见

  • 问题内容: 我正在使用REPL用Scala数组调用Java vararg方法。 如果执行此操作,则会出现错误: 但是,如果我这样做,那就行得通: 我的问题是怎么办?Scala API在哪里定义? 问题答案: 添加告诉编译器将数组视为varargs。Scala与Java的工作原理相同。如果我有方法 我可以这样称呼它: 但是,如果我想向其传递实际的序列(与一样),我会这样做:

  • 问题内容: 最近,我做了一个Netbeans项目,并且正在使用SVN。我看到重复的类错误,并且在控制台中显示 这是PieChartExplorer.java: 我努力了: 清理并重建项目 确保我在所有构造函数中都调用了super 如何解决?下载代码。 问题答案: 前几天我看到了这些症状。 我有我一直在编辑的文件,因此决定将更改分为2个提交。我进入了包含我的文件“ x / y / Z.java”的目