Hotspot jvm源码分析 Java中的Intrinsics

在hotspot jvm里会定义一些intrinsic的方法,从而可以定义自己独有的一些编译的算法,根据不同的架构使用不同的指令集,比如Math.sin,Math.cos之类.

对每个方法hotspot jvm都会定义一个instrinisics id, 这个id可以用于区分java 里自己定义的lib类的方法还是用户自己定义的java的类的方法,用户自己写的类会用 vmIntrinsics::_none 来表示.

初始化

在每个方法初始话的时候,会调用

void methodOopDesc::init_intrinsic_id() {
....
}
来初始化vmIntrinsics::ID

默认的lib方法的id

java中定义自己的lib的方法instrinsics id 是在vmSymbols.hpp中的宏定义实现的

#define VM_INTRINSICS_DO(do_intrinsic, do_class, do_name, do_signature, do_alias)                                       \
  do_intrinsic(_hashCode,                 java_lang_Object,       hashCode_name, void_int_signature,             F_R)   \
....)

在上面的例子中就是定义了 java/lang/Object 的 hashCode 方法的instrinsics id 是_hashCode


调用CallGenerator

CallGenerator是在hotspot jvm中方法调用的核心,不同运行方式是由不同的call generator决定的,而instrinsic_id又是决定不同的call generator的key.


对Java自定义的lib库的方法,jvm 用了LibraryIntrinsic 作为lib库的CallGenerator, 在generate 函数的时候,初始化了LibraryCallKit,里面inline了很多lib的方法,可参考源码

libaray_call.cpp





你可能感兴趣的:(Hotspot jvm源码分析 Java中的Intrinsics)