Android 进阶解密阅读笔记13

2021-02-25  本文已影响0人  jkwen

Android 中的虚拟机

在了解 Dalvik 之前,需要对 Java 虚拟机有所了解,书中也通过一个章节对 Java 虚拟机进行了介绍,之前我也读过了「深入理解 Java 虚拟机」有兴趣的可以看看 「深入理解 Java 虚拟机」阅读完结

Dalvik

命名来自于该虚拟机创作者的祖籍地名,从 Android 诞生一直用到 Android 4.4 版本。虽说也叫虚拟机,但它和 Java 虚拟机有本质区别,因为它基于寄存器,JVM 基于栈,它没有遵循 JVM 规范来实现,为的就是更加适用于移动设备。

同时为了适应于移动设备,特殊的地方还有,

Dalvik 架构

Java 代码经过编译后变成 .class 文件,再经过 Dalvik 内部的 DX 工具打包成 dex 文件,再由类加载器加载,接着解析器对 Dalvik 字节码进行解释,执行。

我们知道 JVM 很大一部分工作在于对内存空间的管理,Dalvik 虚拟机对运行时堆的管理采用了 标记-清除 回收算法。运行时堆被分成 Zygote Space 和 Allocation Space 两部分。Zygote Space 用于管理 Zygote 进程在启动过程中预加载和创建的对象,它不会触发 GC,且是进程间共享的。Allocation Space 是进程间独立的,每个进程都会分到一块 Allocation Space。

在 Android Studio 的 Logcat 里经常会看到一些 GC log,其实就是 Dalvik 虚拟机在进行垃圾收集,具体日志的格式为,

D/dalvikvm: <GC_Reason><Amount_freed>,<Heap_stats>,<External_memory_stats>,<Pause_time>

<> 里的内容分别是,

在 Dalvik 早期,每次执行代码都需要通过解释器将 dex 代码编译成机器码,这显然不高效。后来就引入 JIT 即时编译器,对于多次运行的代码(这种代码叫热点代码)会生成本地机器码,这样就不用每次都编译成机器码了。但是每次程序重新启动时,依然需要编译成机器码才行。为了解决这个问题,就有了 ART(Android Runtime)。

ART

我觉得 ART 的出现是技术迭代发展的必然产物,它和 Dalvik 相比主要区别有,

在 ART 中,不再像 Dalvik 那样可以经常在 logcat 里看到 GC 日志,它对 GC 操作做了更细致的划分,但 GC 日志的格式还是基本保持不变。

上一篇 下一篇

猜你喜欢

热点阅读