卷二 Dalvik与Android源码分析 第五章 Interpreter与JIT 5.5 Interpreter的切换 图书版试读--请勿转发

本文深入探讨了Dalvik虚拟机如何在不同情况下选择使用解释器,重点关注Interpreter与JIT(Just-In-Time)的切换机制,揭示了Android源码中的关键实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



作者 crosskernel@gmail.com


本节分析dalvik虚拟机是通过何种方式选择解释器的。



查找系统属性里解释器执行模式


int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
{
   …
//取出系统属性“dalvik.vm.execution-mode”
    property_get("dalvik.vm.execution-mode", propBuf, "");
if (strcmp(propBuf, "int:portable") == 0) {
/*portable解释器,这个是标配,但是不是默认使用的解释器。在有些新的架构处理器上没有别的解释器可用,可以先用这个。*/
        executionMode = kEMIntPortable;
} else if (strcmp(propBuf, "int:fast") == 0) {
/* “executionMode=2”,所谓fast解释器就是汇编优化过,但是没有jit功能的解释器,jit对于小系统有可能带来副作用,这个解释器是不错选择*/
        executionMode = kEMIntFast;
#if defined(WITH_JIT)
} else if (strcmp(propBuf, "int:jit") == 0) {
/*“ executionMode=3”,既汇编优化又带jit功能。如果是arm v7以上的机器,就是这个了。*/
        executionMode = kEMJitCompiler;
#endif
    }

}


解释器选择:根据执行模式解释器选择器。在解释器入口处有很多处理,这里仅关注解释器选择。


void dvmInterpret(Thread* self, const Method* method, JValue* pResult)
{   …
if (gDvm.executionMode == kExecutionModeInterpFast)
// “dvmMterpStd”是asm优化但不带jit功能的实现
        stdInterp = dvmMterpStd;
#if defined(WITH_JIT)
else if (gDvm.executionMode == kExecutionModeJit)
/*“dvmMterpStd”是asm优化但带jit功能的实现,与上者的区别在编译选项“WITH_JIT”是否激活 */
        stdInterp = dvmMterpStd;
#endif
Else
//Portable解释器,入口函数是“void dvmInterpretPortable(…)”
        stdInterp = dvmInterpretPortable; 
   …
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值