我知道在Java中进行JNI调用时“跨越边界”很慢。
不过,我想知道什么是它,使得它慢?进行JNI调用如此之慢时,底层jvm实现会做什么?
2
(+1)好问题。当我们讨论这个问题时,我想鼓励任何做过实际基准测试的人发表他们的发现。
—
NPE
一个JNI调用需要将传入的Java对象转换为C语言(例如)可以理解的东西。与返回值相同。类型转换和调用堆栈封送处理是其中的一大块。
—
戴夫·牛顿
戴夫,我了解并以前听说过。但是转换到底是什么样的呢?那是什么“东西”?我正在寻找细节。
—
pdeva 2011年
使用直接ByteBuffer在Java和C之间传递数据可以导致相对较低的开销。
—
彼得·劳瑞
该调用需要一个适当的C堆栈框架,将所有有用的CPU寄存器压入(并弹出它们),该调用需要隔离,而且它会阻止很多优化,例如内联。此外,线程还必须离开执行堆栈锁(例如,在本机代码中允许有偏向的锁起作用),然后将其取回。
—
bestsss 2011年