Hotspot 方法调用之Interpreter 源码解析

目录

一、Interpreter

1、from_interpreted_entry和interpreter_entry

2、定义

二、InterpreterCodelet

三、InterpreterCodeletInterface

四、StubQueue

1、定义

2、构造和析构函数

3、request_committed

4、remove_all

5、queues_do和stubs_do

五、CodeletMark


    通过上一篇《Hotspot 方法调用之StubGenerator 源码解析》对StubGenerator的源码分析,我们发现负责执行实际方法调用的解释器的调用地址就是执行call_stub方法传入的entry_point,entry_point来自于待执行的方法Method*,如下图:

下面我们就顺着这条线索继续探讨方法调用的实现。 

一、Interpreter

1、from_interpreted_entry和interpreter_entry

     这两个方法的源码说明如下:

volatile address from_interpreted_entry() const{ return (address)OrderAccess::load_ptr_acquire(&_from_interpreted_entry); }

//load_ptr_acquire先将p转换成指针的指针void* const volatile *,然后再取值
inline void*    OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; }

address interpreter_entry() const              { return _i2i_entry; }

//只在第一次Method初始化的时候调用
void set_interpreter_entry(address entry)      { _i2i_entry = entry;  _from_interpreted_entry = entry; }

其中 set_interpreter_entry的调用关系如下:

 其中Method::link_method的实现如下:

Method::Method构造方法的实现如下:

 

   结合上述调用链可知,在class文件解析的时候就完成了class文件中所有方法对应的Method实例的创建,这时很多关键属性其实是NULL,等到该类链接的时候才会完成Method实例的链接,这里的链接也只是对部分NULL属性的处理,并非对方法中引用到的其他类的链接。

2、定义

     Interpreter是对外的一个解释器的包装类,通过宏定义的方式决定使用CppInterpreter或者TemplateInterpreter,其定义在hotspot src/share/vm/interpreter/interpreter.hpp中,如下图:

其中CC_INTERP_ONLY和NOT_CC_INTERP的定义如下:

 

即如果定义了宏CC_INTERP,则Interpreter继承自CppInterpreter,否则继承自TemplateInterpreter,此时类继承关系如下:

其中interpreter_x86.hpp的定义如下:

即Interpreter没有添加新的属性,只添加了public static方法,如codelet_containing,local_index_at等

二、InterpreterCodelet

     InterpreterCodelet表示一段解释器代码,所有的解释器代码都放在InterpreterCodelet中,同时还包含了额外的用于打印和调试的信息,其定义也是在interpreter.hpp中。InterpreterCodelet继承自Stub,Stub用来表示一段代码,是一个抽象基类,其类继承关系如下:

其中ICStub用来表示一段编译中间体代码。

     Stub只定义了基础方法,没有任何属性,且所有方法的实现都是ShouldNotCallThis(),即要求子类实现所有的方法,其定义在hotspot src/share/vm/code/stubs.hpp中,如下图:

     InterpreterCodelet添加了三个private属性:

  • _size:i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值