1. 程式人生 > >JVM原始碼系列: Java中的Intrinsics

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