JVM只是一个规范,或者是符合该规范的一个实现,或者这样的实现运行的实例。JVM规范中并没有规定必须使用哪种GC机制,只规定了必须提供自动的内存管理的功能。而DalvikVM是一个具体的实现,只要能符合规范正确执行java的class文件的就是JVM,那么Android开发包中的dx和DialvikVM结合起来,就可以看成是一个JVM了,严格来说经过java Compliance Kit的测试并获得授权后才能成为JVM,它与JVM最大的区别是采用了基于寄存器的指令集而JVM采用了基于栈的指令集,可以看做是专门为ARM优化的设计。
垃圾收集是Dalvik VM内存管理的核心,垃圾收集的性能在很大程度上影响一个Android应用程序内存使用的效率。顾名思义,垃圾收集就是收集垃圾内存加以回收。
在垃圾回收算法技术中,主要有以下三种经典算法:
引用计数
MarkSweep算法
SemiSpaceCopy算法。
引用计数算法: 使用一个变量记录这块内存或者对象的使用次数
优点:
(1) 在对象变成垃圾时候,可以马上进行回收,回收效率和成本都是最低的。
-
缺点:(2)内存使用效率最高,基本上没有花费时间,不需要把所有访问COM对象都停下来。
(1)引用计数会影响执行效率,每引用一次都需要更新引用计数器。
(2)不能解决交叉引用或者环形引用的问题。比如在一个环形链表里,每一个元素都引用前面的元素,这样首尾相连的链表,当所有元素都不需要时候,就没有办法识别回收
标记清除算法:
这个算法可以分为两大阶段:标记和清除。这种分布执行的思路构成了现代垃圾收集算法的思想基础。
与引用计数算法相比优势:
(1)该算法不需要检测每一次内存分配的指针操作,只需在标记阶段进行一次统计就行。可以非常自然的处理环形问题。
(2)创建对象销毁对象时候少了操作引用计数的开销。
缺点:标记清除阶段中把所有对象停止执行。导致垃圾回收器运行过程中应用程序必须暂时停止停止,待垃圾回收器全部运行完成,才能重新启动。
Dalvik虚拟机最常用的算法便是MarkSweep算法,该算法一般分Mark阶段(标记出活动对象)、Sweep阶段(回收垃圾内存)和可选的Compact阶段(减少堆中的碎片)。Dalvik虚拟机实现不进行可选的Compact阶段(减少堆中的碎片)。Dalvik虚拟机的实现不进行可选的Compact阶段。