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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值