为什么JNI调用本机方法比sun.misc.Unsafe中的类似更慢

yur*_*iyo 9 java performance java-native-interface unsafe

我正在开发类似于sun.misc.Unsafe的JNI实现,但具有扩展的内存管理.

如何从sun.misc.Unsafe和我开发的库中解释本机方法的调用时间是非常不同的?

一些数字:sun.misc.Unsafe.getInt(地址)需要〜1ns,当我的类似方法需要~10ns

两个实现完全相同,遵循openJDK的源代码,只是通过指针返回变量.在JNI模块中不安全,以与其他模式相同的方式注册.

如何加快JNI通话?是什么让Unsafe对性能如此特别?

谢谢,Yury /

Pet*_*rey 11

如果您在Unsafe类中查找本机方法的源代码,您会发现没有JNI实现.相反,不安全方法被内联为机器代码.getInt(long)例如,成为一个机器代码指令.

因此,您无法编写与使用Unsafe一样快的JNI方法,而无需更改JVM以便内联机器代码.

  • 是的,你是对的.不安全实际上内联为内在.在vm/prims/unsafe.cpp中很容易找到getInt的代码DEFINE_GETSETOOP(jint,Int); 然后是GET_FIELD(obj,offset,jboolean,v); 然后是#define GET_FIELD(obj,offset,type_name,v)\ oop p = JNIHandles :: resolve(obj);\type_name v =*(type_name*)index_oop_from_field_offset_long(p,offset) (2认同)