JVM原始碼系列: Java中的Intrinsics
阿新 • • 發佈:2019-01-26
在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