java虚拟机和dalvik垃圾回收机制有和不同?网上也没发现这方面的资料。
1条回答 默认 最新
- rednaxelafx 2009-07-29 00:16关注
Java VM是一个规范,或者符合该规范的实现,或者这样的实现运行的实例。JVM规范中并没有规定要使用各种GC机制;或者说,JVM规范写明了符合规范的JVM实现要提供自动内存管理的功能,但[url=http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#21949]并不一定要有某种特定的“GC”[/url]。
Dalvik VM是一个具体的实现。于是笼统的问“JVM与Dalvik的GC有何不同”是不合适的,对比的两者不在同一个层次上。
即便是在同一个JVM中,一般也会有多个GC实现。例如Sun的HotSpot VM中根据不同的使用场景而实现了不同算法/不同调教的GC。各种JVM实现采用了怎样的GC算法,网上已经有很多资料了,很容易查到,这里就不多说了。Dalvik VM在1.0的时候使用的GC算法是没有分代的标记-清除(mark-and-sweep),对堆上数据进行准确式(exact/precise)标记,对栈/寄存器上数据进行保守式(conservative)标记。标记的内容可以参考这段注释:
[code="c"]//dalvik/vm/alloc/MarkSweep.c
/* Mark the set of root objects.
*- Things we need to scan:
- - System classes defined by root classloader
- - For each thread:
- - Interpreted stack, from top to "curFrame"
- - Dalvik registers (args + local vars)
- - JNI local references
- - Automatic VM local references (TrackedAlloc)
- - Associated Thread/VMThread object
- - ThreadGroups (could track & start with these instead of working
- upward from Threads)
- - Exception currently being thrown, if present
- - JNI global references
- - Interned string table
- - Primitive classes
- - Special objects
- - gDvm.outOfMemoryObj
- - Objects allocated with ALLOC_NO_GC
- - Objects pending finalization (but not yet finalized)
- - Objects in debugger object registry *
- Don't need:
- - Native stack (for in-progress stuff in the VM)
- - The TrackedAlloc stuff watches all native VM references. */[/code] 许多GC实现都是在对象开头的地方留一小块空间给GC标记用。Dalvik VM则不同,在进行GC的时候会单独申请一块空间,以位图的形式来保存整个堆上的对象的标记,在GC结束后就释放该空间。 在标记阶段,从根集合开始,沿着对象用的引用进行标记直到没有更多可标记的对象为止。标记结束后,被标记的就是活着的对象,没被标记到的就是“垃圾”。在清除阶段,Dalvik VM并不直接对堆做什么操作,而是在一个记录分配状况的位图上把被认为是垃圾的对象所在位置的分配标记清零。为了不让这个位图太大,位图中并不是每一位对应到堆上的一个字节,而是对应到一块固定大小的空间。为此,堆空间的分配也是有一定对齐的。 只进行标记-清除,在经过多次GC后可能会使堆被碎片化。Android所实现的libc(称为Bionic)对这种情况有特别的实现,可以避免碎片化问题。 我只看了Android 1.0里Dalvik VM的实现,后面1.5(Cupcake)和2.0(Donut)的实现我还没看,不知道有些什么变化呢。
其实Dalvik VM的根源还是在JVM上。能符合规范正确执行Java的.class文件的就是JVM;那么Android开发包中的dx与Dalvik VM结合起来,就可以看成是一个JVM了(要把一个东西称为“JVM”必须要通过[url=https://jck.dev.java.net/]JCK(Java Compliance Kit)[/url]的测试并获得授权后才能行,所以严格来说dx + Dalvik VM不能叫做JVM,因为没授权)。如果去阅读Dalvik VM的文档,会发现其中有很多引用到JVM规范的地方,而且整体设计都考虑到了与JVM的兼容性的。它与JVM规范的规定最大的不同在于它采用了基于寄存器的指令集,而JVM采用了基于栈的指令集。这可以看作是专门为ARM而优化的设计。Dalvik VM要省内存和省电,有很多设计都是围绕这两个目标来进行的。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报