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. React-Router ---withRouter

    import React from 'react' import { withRouter } from 'react-router' const Hello = (props) => { re ...

  2. 神奇的splay树

    神奇的splay树 总结 splay树是一种BST,其通过不断的splay操作维持树的平衡:其基本思想是将频率高的点(实际是每次查找的点)通过splay操作旋转到树根 核心操作: update(x): ...

  3. PAT_A1125#Chain the Ropes

    Source: PAT A1125 Chain the Ropes (25 分) Description: Given some segments of rope, you are supposed ...

  4. 记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使用

    转自:https://mp.weixin.qq.com/s/9IKaXeWTiiQTFlvZzxgsEA 记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使 ...

  5. C#学习笔记_05_输入输出

    05_输入输出 输出语句 Console.WriteLine( ); 将括号内内容输出到控制台,并且换行 Console.Write( ); 将括号内内容输出到控制台,不换行 Console.Writ ...

  6. Bootstrap关于表单(二):水平表单

    Bootstrap框架默认的表单是垂直显示风格,但很多时候我们需要的水平表单风格(标签居左,表单控件居右) 在Bootstrap框架中要实现水平表单效果,必须满足以下两个条件: 1.在<form ...

  7. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)

    9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...

  8. 洛谷 P3178 BZOJ 4034 [HAOI2015]树上操作

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...

  9. i=i+1,i+=1与i++的区别

    1. i=i+1 a.读取右i的地址 b,i=1 c.读取左i的地址 d. 值赋给左i 2.i+=1 a.读取左i的地址 b.i+1 c.值给i 3.i++ a.读取右i的地址 b.值加1

  10. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

    狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...