【发布时间】:2011-10-08 18:46:22
【问题描述】:
我知道在 Java 中进行 JNI 调用时“越界”很慢。
但是我想知道是什么让它变慢了? 当 JNI 调用变得如此缓慢时,底层 jvm 实现会做什么?
【问题讨论】:
-
(+1) 好问题。当我们讨论这个主题时,我想鼓励任何做过实际基准测试的人发布他们的发现。
-
一个JNI调用需要把传入的Java对象转换成C(例如)可以理解的东西;与返回值相同。类型转换和调用堆栈编组是其中很大一部分。
-
戴夫,我了解并听说过。但是究竟是怎样的转换呢?那是什么东西?我正在寻找详细信息。
-
使用直接 ByteBuffers 在 Java 和 C 之间传递数据可以导致相对较低的开销。
-
调用需要适当的 C 堆栈帧,推送所有有用的 CPU 寄存器(并将它们弹回),调用需要隔离,并且它还阻止了许多优化,如内联。此外,线程必须离开执行堆栈锁(例如,允许偏向锁在本机代码中工作),然后将其取回。
标签: java performance java-native-interface