开发者社区> 问答> 正文

JNI与Intrinsic是怎样的?

JNI与Intrinsic是怎样的?

展开
收起
1358896759097293 2021-05-04 15:27:38 870 0
1 条回答
写回答
取消 提交回答
  • 45271990@qq.com

    (一)高级主题: intrinsic 如下图所示,以非常常见JNA“currentThread”为例子,说明Intrinsic机制。Intrinsic在看到currentThread的时候,不会去JNI,而是通过形成更高效的版本。 这里inline_native_currentThread的时候,最终会调用generate_curent_thread工具。然后看里面的实现核心部分,创建“ThreadLocalNode()”,代表当前JavaThread结构的指针,再通过JavaThread结构里的threadObj_offset()拿到它,通常是一个偏移量,拿到Object以后作为返回值返回。这里是一段AI,真正生成代码时被翻译成非常简约的几条指令,直接返回。所以“currentThread”变得非常高效,这就是Intrinsic机制,主要为性能而生。 29.png 30.png

    (二)Intrinsic性能分析 对比一下Intrinsic与非Intrinsic性能,如下图所示,是用jmh写的Benchmark,可以规避掉一些具体的预热不够,导致性能测试不准的问题,用它进行测试,也是官方推荐的版本。 Intrinsic版本,下面测试叫“jni”,主要区别就是Intrinsic后面接了一个叫isAlive的调用。isAlive本身状态调用看起来非常轻量,但因为他没有做Intrinsic,所以最终会走JNI。 31.png

    下图所示,对比普通Intrinsic与加上JNI的Intrinsic性能,普通 Intrinsic的性能大概是3亿次每秒;加上JNI的Intrinsic版本的性能是2000万次每秒,差了十几倍,差距很大。

    32.png

    进一步看性能问题,最重要的是performing,performing手段是perform,public第二段JNI版本,前面两个热点方法都是“ThreadStateTransition”现任状态转换。前面说到,假如JNI回到 Java时候做GC肯定要停下来,所以这有个内存同步比较好资源,要等的时间比较长,所以这两个函数是最热的。

    33.png

    下面是“JVM_IsThreadAlive”实现。后面是“HandleMark::pop_and_restore”在调JNI时需要把oop包装成handle,JNI退出时,需要消费handle, restore指有开销。再后面“java_lang_Thread::is_alive”占比4.77% 非常小。 由此可以看出Intrinsic提供性能非常好的机制,直接调用JNI,性能可能差一点,但也可以接受。

    2021-05-05 22:54:05
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载