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



作者 [email protected]


本节分析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; 
   …
}

你可能感兴趣的:(android,虚拟机,解释器,dalvik)