在hotspot jvm里会定义一些intrinsic的方法,从而可以定义自己独有的一些编译的算法,根据不同的架构使用不同的指令集,比如Math.sin,Math.cos之类.
对每个方法hotspot jvm都会定义一个instrinisics id, 这个id可以用于区分java 里自己定义的lib类的方法还是用户自己定义的java的类的方法,用户自己写的类会用 vmIntrinsics::_none 来表示.
在每个方法初始话的时候,会调用
void methodOopDesc::init_intrinsic_id() { .... }来初始化vmIntrinsics::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) \ ....)
CallGenerator是在hotspot jvm中方法调用的核心,不同运行方式是由不同的call generator决定的,而instrinsic_id又是决定不同的call generator的key.
对Java自定义的lib库的方法,jvm 用了LibraryIntrinsic 作为lib库的CallGenerator, 在generate 函数的时候,初始化了LibraryCallKit,里面inline了很多lib的方法,可参考源码
libaray_call.cpp