1个答案 按时间排序 按投票排序
-
采纳的答案
Java VM是一个规范,或者符合该规范的实现,或者这样的实现运行的实例。JVM规范中并没有规定要使用各种GC机制;或者说,JVM规范写明了符合规范的JVM实现要提供自动内存管理的功能,但并不一定要有某种特定的“GC”。
Dalvik VM是一个具体的实现。于是笼统的问“JVM与Dalvik的GC有何不同”是不合适的,对比的两者不在同一个层次上。
即便是在同一个JVM中,一般也会有多个GC实现。例如Sun的HotSpot VM中根据不同的使用场景而实现了不同算法/不同调教的GC。
各种JVM实现采用了怎样的GC算法,网上已经有很多资料了,很容易查到,这里就不多说了。Dalvik VM在1.0的时候使用的GC算法是没有分代的标记-清除(mark-and-sweep),对堆上数据进行准确式(exact/precise)标记,对栈/寄存器上数据进行保守式(conservative)标记。标记的内容可以参考这段注释://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. */
许多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”必须要通过JCK(Java Compliance Kit)的测试并获得授权后才能行,所以严格来说dx + Dalvik VM不能叫做JVM,因为没授权)。如果去阅读Dalvik VM的文档,会发现其中有很多引用到JVM规范的地方,而且整体设计都考虑到了与JVM的兼容性的。它与JVM规范的规定最大的不同在于它采用了基于寄存器的指令集,而JVM采用了基于栈的指令集。这可以看作是专门为ARM而优化的设计。Dalvik VM要省内存和省电,有很多设计都是围绕这两个目标来进行的。2009年7月29日 00:16
相关推荐
### 深入理解Android(二):Java虚拟机Dalvik #### 一、背景与研究目的 在深入了解Dalvik虚拟机之前,我们先来探讨一下背景与研究目的。随着移动设备性能的不断提高,Android系统因其开放性而吸引了众多开发者...
Dalvik使用一种类似传统JVM的垃圾回收机制来管理内存。它跟踪应用中对象的创建和使用情况,并在不再需要这些对象时自动释放内存。垃圾回收算法对于保证应用稳定运行和防止内存泄漏至关重要。 5. Dalvik虚拟机的安全...
ART还引入了垃圾回收机制的改进,如引用计数和分代垃圾收集,以减少内存消耗和提高性能。 **Java环境** 在Android中,Java环境包括了Java开发者需要的各种库和工具。Android SDK(Software Development Kit)提供...
Dalvik和ART都实现了垃圾回收机制,自动回收不再使用的对象所占用的内存。这使得开发者无需手动管理内存,专注于应用程序的逻辑开发。 5. **多线程与并发** 在Android平台上,JAVA虚拟机支持多线程,允许开发者...
5. 垃圾回收机制:Dalvik虚拟机内部实现了垃圾回收(GC)机制,它负责自动管理内存,释放不再使用的对象占用的内存空间。GC机制对于防止内存泄漏、提高应用性能至关重要。 6. 进程与线程管理:在Android中,每个...
与传统的Java虚拟机(如JVM)不同,Dalvik使用.dex(Dalvik Executable)格式的字节码,这种格式更适合移动设备的存储和内存限制。 2. **.dex文件格式**: .dex文件是一种专门为Dalvik设计的优化的字节码格式,它...
与标准的Java虚拟机(JVM)不同,Dalvik设计时考虑了嵌入式设备的资源限制,特别是在内存和处理器性能方面。书中的第二卷很可能深入到更复杂的主题,如垃圾回收、类加载机制、字节码执行以及优化策略。 1. **字节码...
3. **垃圾回收机制**:由于Android设备内存有限,Dalvik虚拟机采用了特殊的垃圾回收策略,如可达性分析,自动回收不再使用的对象,以释放内存资源。 4. **线程管理**:Dalvik虚拟机支持多线程,每个Android应用程序...
同时,了解Dalvik的内存模型和垃圾回收机制,有助于开发者避免因内存管理不当导致的问题。 此外,Dalvik的调试工具如DDMS(Dalvik Debug Monitor Service)也是Android开发者的重要辅助,它提供了内存监控、线程...
7. **垃圾回收**:Dalvik虚拟机采用非分代的垃圾回收机制,即单一的垃圾收集器。当内存不足时,垃圾回收器会扫描堆内存,回收不再引用的对象所占用的空间。 8. **线程管理**:除了主线程外,Dalvik虚拟机还负责创建...
与标准的Java虚拟机不同,Dalvik针对嵌入式设备进行了优化,采用.dex(Dalvik Executable)格式存储字节码,以减少内存占用并提高运行速度。 2. **DEX文件格式**: .dex文件是Dalvik虚拟机的执行文件,它包含类...
- **垃圾回收**: Dalvik虚拟机使用了自己的垃圾回收机制,有效地管理内存,防止内存泄漏。 2. **Dalvik Just-In-Time (JIT) 编译** - 在早期版本的Android中,Dalvik采用解释执行方式,后来引入了JIT编译技术,将...
它负责执行应用层代码,并提供了高效的内存管理和垃圾回收机制。本文将重点讨论Dalvik虚拟机中的内存管理机制,特别是内存分配的过程。 #### 二、内存分配原理 内存管理是Dalvik虚拟机的重要组成部分,主要分为...
常见的嵌入式Java虚拟机有KVM(Kaffe Virtual Machine)、IcedTea-Embedded和Dalvik等,它们针对嵌入式平台进行了优化。 Java虚拟机分析主要涉及以下几个方面: 1. **内存管理**:嵌入式JVM需要有效地管理内存,...
3. **垃圾回收机制**:考虑到移动设备对内存使用的要求,Dalvik虚拟机实现了高效且低延迟的垃圾回收机制。这种机制能够更好地适应移动设备的特点,减少了对用户体验的影响。 4. **类加载器**:Dalvik虚拟机中的类...
Dalvik虚拟机是基于寄存器架构的,这与传统的基于栈的Java虚拟机有所不同。这个设计选择是为了在移动设备上实现更高效、更节省资源的执行环境。 **1. Dalvik虚拟机架构** Dalvik虚拟机由以下几个关键组件构成: -...
- **内存管理**: ART采用了更高效的内存分配和垃圾回收策略。它使用了分代垃圾回收,减少了暂停时间,提高了应用响应速度。 - **64位支持**: 与Dalvik相比,ART支持64位架构,充分利用了现代处理器的能力,提升了...
垃圾回收机制 - **分代收集算法**:基于对象存活周期的不同将内存划分为几块,不同的对象分配到不同的区域,从而提高回收效率。 - **标记-清除算法**:标记所有需要回收的对象,然后统一回收被标记的对象。 - **...
与传统的Java虚拟机不同,Dalvik并非遵循Java虚拟机标准,而是设计用于移动设备,特别是针对内存和处理器性能有限的设备。 1. **Dalvik虚拟机的结构与特性** - **独立的虚拟机实例**:每个Android应用都在其自己的...
垃圾收集(Garbage Collection, GC)是Dalvik虚拟机管理内存的重要机制,其主要任务是自动回收不再被引用的对象,以释放内存资源。本篇文章将深入探讨Dalvik虚拟机的垃圾收集过程,特别是采用的Mark-Sweep算法,以及...