Dalvik虚拟机与Java虚拟机有着很多相似的特性,都支持GC,JIT,JNI等等。其主要区别在于文件格式以及指令集不同,下面对两者的特性进行比较与讨论。

Difference1:文件格式

  Dalvik的虚拟机类文件采用dex格式,而JVM的类文件是class格式。不同之处在于,我们熟悉的class字节码文件中只包含一个类,而dex文件中可以包含多个类。其好处在于多个类中重复的常数和字符串只会保存一份,一定程度上节省了空间,更适于在手机上运行。

Difference2:指令集

  Dalvik的指令集基于寄存器,而JVM的指令集基于堆栈。不同之处在于,基于寄存器的指令在寄存器中寻址,速度更快但指令长度长;基于堆栈的指令集更短,但占用CPU时间较多。其对比类似于CISC与RISC的对比。从移植性而言,显然基于堆栈的指令集可移植性更好,它不针对目标机器的寄存器做任何优化。而基于寄存机的指令集可以再程序运行之前针对目标机器的寄存器对程序进行优化,这种优化是在编译过程中的优化,并非类似于JIT在运行过程中的动态优化,但最终目标都是将程序转化成本地机器语言。

  下面,针对Dalvik虚拟机的内存管理,JIT,垃圾收集、JIT、JNI以及进程和线程管理进行讨论。

内存管理

  Dalvik虚拟机的内存大体上可以分为三个部分:Java Object Heap、Bitmap Memory和Native Heap。

Java Object Heap用来存放Java对象,不同手机厂商对其大小有不同的设置,可以通过ActivityManager的getMemoryClass获取其最大值,该值是Android应用所能使用的最大内存。

Bitmap Memory用于存放和处理图片。在Android3.0之前,Bitmap Memory是Native Heap的一部分,其大小计入Java Object Heap,即bitmap和其他java对象所占用的内存不能超过上面JOH的最大值。在Android3.0之后,Bitmap Memory直接在JOH中分配,便于GC。

Native Heap是本地机器语言申请分配的内存。

垃圾回收

  在Android2.3之前的版本中,Dalvik虚拟机的垃圾回收策略如下:

  • 垃圾收集线程在执行的时候,其它的线程都停止,从而一次收集完全部的垃圾,这样导致的结果就是一次垃圾收集造成的程序中止时间通常都大于100ms。
  • 在Android2.3之后,垃圾收集线程与其它线程是并发执行,一次可能只收集一部分垃圾,使得一次垃圾收集造成的程序中止时间大大降低,通常都小于5ms。

JIT

  JIT是在程序运行的过程中进行编译,将反复调用的代码转化为本地机器码保存起来,这个过程是在运行时动态执行的,相对于程序编译时的优化而言,JIT会占用程序运行时间。Android2.2之后才开始支持JNI。

本地调用

  Java程序运行在虚拟机上,需要将程序翻译成目标机器的指令来执行,有些功能需要调用目标机器操作系统接口来完成。Java的本地调用可以帮助我们在Java代码和C\C++代码中互相调用函数。Android提供了NDK来帮助我们实现JNI。

线程管理

  Android的进程主要有两个特点:

  • 每一个Android APP进程都有一个Dalvik虚拟机实例,这保证了多个app在运行时互不影响。
  • 每一个Android应用程序进程都是由一种Zygote的进程fork出来的。而Zygote进程是由初始化进程创造出来的。Zygote进程在启动的时候,会创建一个虚拟机实例,并且在这个虚拟机实例将所有的Java核心库都加载起来。每当Zygote进程需要创建一个Android应用程序进程的时候,它就通过复制自身来实现,也就是通过fork系统调用来实现。这些被fork出来的Android应用程序进程,一方面是复制了Zygote进程中的虚拟机实例,另一方面是与Zygote进程共享了同一套Java核心库。这样不仅Android应用程序进程的创建过程很快,而且由于所有的Android应用程序进程都共享同一套Java核心库而节省了内存空间。

Dalvik虚拟机和JVM的对比的更多相关文章

  1. JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

    1.什么是JVM?   JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是, ...

  2. Dalvik 虚拟机和 Sun JVM 在架构和执行方面有什么本质区别?

    目前我理解的是: 两者共同点: 都是解释执行 byte code 都是每个 OS 进程运行一个 VM,并执行一个单独的程序 在较新版本中(Froyo / Sun JDK 1.5)都实现了相当程度的 J ...

  3. Android内存优化(一)Dalvik虚拟机和ART虚拟机对比

    1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.D ...

  4. Android Dalvik虚拟机

    虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的. 可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik V ...

  5. 深入理解JAVA虚拟机原理之Dalvik虚拟机(三)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用 ...

  6. Android ART运行时与Dalvik虚拟机

    这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验. 实验内容很简单:把felix包里的feli ...

  7. 转 Android Dalvik虚拟机初识

    首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题 ...

  8. Android Dalvik虚拟机初识(转)

    原文地址:http://blog.csdn.net/andyxm/article/details/6126907 android虚拟机jvmjava优化linux内核 首先,让我们来思考下面几个问题: ...

  9. Android(java)学习笔记156:Java虚拟机和Dalvik虚拟机的区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

随机推荐

  1. Delphi 不用标题栏移动窗体

    procedure TxxxxForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: I ...

  2. jquery Contains 实现查询

    var filter = $(this).val(); var filterResult = $(this).find('h2:Contains(' + filter + ')'); if (filt ...

  3. (转)Arcgis for Js之鼠标经过显示对象名的实现

    http://blog.csdn.net/gisshixisheng/article/details/41889345 在浏览地图时,移动鼠标经过某个对象或者POI的时候,能够提示该对象的名称对用户来 ...

  4. jsp 多条件组合查询

    web层: public String query(HttpServletRequest request, HttpServletResponse response) throws ServletEx ...

  5. eas之排序接口

    KDTable目前本身并不支持排序功能,但提供了排序的接口,用户通过实现该接口(ISortManager)即可实现排序的功能.同时KDTable提供了一个简单实现KDTSortManager,这个类完 ...

  6. 洛谷P1307 数字反转【水题】

    给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入输出格式 输入格式: 一个整数 NN ...

  7. COOKIE, SESSION, JSESSION

    http://www.360doc.com/content/11/1027/10/7472437_159535413.shtml

  8. js获取数组中任意一项

    1.获取数组任一项 在一些实际应用场景中,会要求实现一个随机的需求,随机获取某一项,来展示出来,都知道要通过javaScript的Math.random()方法来实现,这里我在Array的原型上添加了 ...

  9. 【ACM】hdu_1096_A+BVIII_201307261748

    A+B for Input-Output Practice (VIII)Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32 ...

  10. VMware 12安装CentOS 6.9时出现:The centos disc was not found in any of your drives.Please insert the centos disc and press OK to retry

    错误: The centos disc was not found in any of your drives.Please insert the centos disc and press OK t ...