栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

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

CriticalNatives



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/485827.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号