上一节说了Android的五层架构,今天说说其中的Dalvik虚拟机,简称DVM。
DVM(Dalivk Virtual Machine),是Google专门为Android
平台开发的虚拟机,在Android的运行时库层。
DVM虽然也是编译java文件,但是和JVM还是有区别。
JVM
基于栈,意味着需要去栈中读写数据,所需要的指令会更多,这样会导致速度变慢,对于性能有限的移动设备显然不合适。它的优点在于足够简单,跨平台,并且可以保证在低硬件条件下可以运行。DVM
是基于寄存器的,它没有基于栈的虚拟机在复制数据时而使用大量的出入栈指令,指令更紧凑、简洁。而且寄存器存储速度比栈要快的多,可以根据硬件实现最大的优化,所以就适合移动设备。
JVM
执行顺序:.java文件——.class文件——.jar文件DVM
执行顺序:.java文件——.class文件——.dex文件
DVM
会用dx工具把所有的class文件打包成一个.dex文件,然后DVM会从该.dex文件中读取指令和数据。这个.dex文件将所有的.class文件里面所包含的信息全部整合到了一起,这样加载类查找类就加快了速度。当然也带来了65535
的错误,所以又使用了Multidex
技术。
DVM可以允许在有限的内存中同时允许多个进程,每个应用都允许在一个DVM
实例中,每一个DVM
实例都运行在一个独立的进程空间中,这样就能保证在DVM崩溃的时候,其他应用可以正常使用。
Zygote是一个DVM
进程,同时也用来创建和初始化其他DVM进程。
DVM拥有共享机制
,也就是不同应用之间运行时可以共享相同的类,这样效率就提高了。
DVM进行垃圾回收使用的是Mark-Sweep
也就是标记清除算法,通过Mark Stack
进行遍历存活的对象并标记。而大部分JVM使用的是Generational Collection
,分代收集算法,主要思想是根据对象存活的生命周期将内存划分为若干个不同的区域,比如老年代和新生代
。然后针对不同的区域采用不同的垃圾回收算法。
DVM中GC的原因主要有5种:
GC_CONCURRENT
:当堆开始填充时,并发GC可以释放内存。GC_FOR_MALLOC
:当堆内存已满时,app尝试分配内存而引起的GC,系统必须停止app并回收内存。GC_HPROF_DUMP_HEAP
:当你请求创建 HPROF 文件来分析堆内存时出现的GC。GC_EXPLICIT
:显示的GC,例如调用System.gc()(应该避免调用显示的GC,信任GC会在需要时运行)。GC_EXTERNAL_ALLOC
:仅适用于 API 级别小于等于10 ,用于外部分配内存的GC。DVM
是专门针对移动设备而生的,所以在很多地方针对移动端的平台特性进行了设计和改编。比如多进程,对应了多应用。共享机制对应了多应用中相同类运行。基于寄存器架构,提高对内存访问。整合.class文件,减少I/O操作等等。仔细想一想,都是为了移动端所设计,所以对应的也是移动端
的场景。
至于为什么后面由换成了ART?我们下次再谈。
https://blog.csdn.net/itachi85/article/details/73149305