巧用一文带你彻底搞懂解释器的内部构造和解释执行过程

模板解释器

最简单的Java虚拟机可以只包括类加载器和解释器:类加载器加载字节码iconst_1、iconst_1、iadd并传给虚拟机,解释器按照字节码计算并得到结果。在没有JIT编译器的情况下,解释器从某种程度上来说就是虚拟机本体,有关虚拟机的绝大部分问题都能在解释器中找到答案。

本章将详细讨论解释器的内部构造和解释执行过程。

解释器体系

众所周知,HotSpot VM默认使用解释和编译混合(-Xmixed)的方式执行代码。首先它使用模板解释器对字节码进行解释,当发现一段代码是热点时,就使用C1或C2即时编译器优化编译后再执行,这也是它的名字——“热点”的由来。解释器的代码位于hotspot/share/interpreter,它的总体架构如图5-1所示。

HotSpot VM有一个C++字节码解释器,还有一个模板解释器(Template Interpreter),它们有很大的区别。

C++解释器行为

对于Java字节码istore_0和iadd来说,如果是C++字节码解释器(见图5-1右侧部分所示),那么它的工作流程如代码清单5-1所示。

代码清单5-1 C++字节码解释器伪代码

void cppInterpreter::work(){
for(int i=0;i<bytecode.length();i++){
switch(bytecode[i]){
case ISTORE_0:
int value = operandStack.pop();
localVar[0] = value;
break;
case IADD:
int v1 = operandStack.pop();
int v2 = operandStack.pop();
int res = v1+v2;
operandStack.push(res);
break;
....
}
}
}

C++解释器使用C++语言模拟字节码的执行:iadd是两个数相加,字节码解释器从栈上pop两个数据然后求和,再push到栈上。如果是模板解释器就完全不一样了。

模板解释器

行为模板解释器是一堆机器代码的例程,会在虚拟机创建时初始化好,换句话说,模板解释器在虚拟机初始化的时候为iadd和istore_0申请两片内存,并设置为可读、可写、可执行,然后向内存写入模拟iadd和istore_0执行的机器代码。在解释执行时遇到iadd,跳转到相应内存,并将该片内存的数据视作代码直接执行。

通常,JIT暗指即时编译器,但是JIT(Just-In-Time)这个词本身并没有编译器的含义,它只是表示“即时”,如果按照这个定义,JIT指运行时机器代码生成技术。在这个定义下,模板解释器也属于JIT范畴,因为根据上面的描述,它的各个组件如同各种字节码,异常处理、安全点处理等都是在虚拟机启动的时候动态生成机器代码,然后组成一个整体的。如果上面的描述太过抽象,可以参见代码清

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值