android5.0之前使用的虚拟机是Dalvik虚拟机,这个虚拟机在JVM的基础上做了一定的优化。android5.0之后,android采用了新的虚拟机ART,本文主要对Dalvik、JVM、ART之间进行对比。

##一.Dalvik虚拟机
###1.概念
  Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
  有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的诉据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

###2.与JVM对比

  1. Dalvik虚拟机与Java虚拟机的最显著区别是它们分别具有不同的类文件格式以及指令集。Dalvik虚拟机使用的是dex(Dalvik Executable)格式的类文件,而Java虚拟机使用的是class格式的类文件。一个dex文件可以包含若干个类,而一个class文件只包括一个类。由于一个dex文件可以包含若干个类,因此它就可以将各个类中重复的字符串和其它常数只保存一次,从而节省了空间,这样就适合在内存和处理器速度有限的手机系统中使用。一般来说,包含有相同类的未压缩dex文件稍小于一个已经压缩的jar文件。
  2. Dalvik虚拟机使用的指令是基于寄存器的,而Java虚拟机使用的指令集是基于堆栈的。事实上,基于寄存器和基于堆栈的指令集之争,就如精简指令集(RISC)和复杂指令集(CISC)之争,谁优谁劣,至今是没有定论的。
  3. 将多个类文件收集到同一个dex文件中,以便节省空间;
  4. 使用只读的内存映射方式加载dex文件,以便可以多进程共享dex文件,节省程序加载时间;
  5. 提前调整好字节序(byte order)和字对齐(word alignment)方式,使得它们更适合于本地机器,以便提高指令执行速度;
  6. 尽量提前进行字节码验证(bytecode verification),提高程序的加载速度;
  7. 需要重写字节码的优化要提前进行。
  8. 内存管理不同
      Dalvik虚拟机的内存大体上可以分为Java Object Heap、Bitmap Memory和Native Heap三种。
      Java Object Heap是用来分配Java对象的,也就是我们在代码new出来的对象都是位于Java Object Heap上的。Dalvik虚拟机在启动的时候,可以通过-Xms和-Xmx选项来指定Java Object Heap的最小值和最大值。为了避免Dalvik虚拟机在运行的过程中对Java Object Heap的大小进行调整而影响性能,我们可以通过-Xms和-Xmx选项来将它的最小值和最大值设置为相等。
      Java Object Heap的最小和最大默认值为2M和16M,但是手机在出厂时,厂商会根据手机的配置情况来对其进行调整,例如,G1、Droid、Nexus One和Xoom的Java Object Heap的最大值分别为16M、24M、32M 和48M。我们可以通过ActivityManager类的成员函数getMemoryClass来获得Dalvik虚拟机的Java Object Heap的最大值。
      这个Java Object Heap的最大值也就是我们平时所说的Android应用程序进程能够使用的最大内存。这里必须要注意的是,Android应用程序进程能够使用的最大内存指的是能够用来分配Java Object的堆。
      Bitmap Memory也称为External Memory,它是用来处理图像的。在HoneyComb之前,Bitmap Memory是在Native Heap中分配的,但是这部分内存同样计入Java Object Heap中,也就是说,Bitmap占用的内存和Java Object占用的内存加起来不能超过Java Object Heap的最大值。这就是为什么我们在调用BitmapFactory相关的接口来处理大图像时,会抛出一个OutOfMemoryError异常的原因:
      在HoneyComb以及更高的版本中,Bitmap Memory就直接是在Java Object Heap中分配了,这样就可以直接接受GC的管理。
      此外,在HoneyComb以及更高的版本中,我们可以在AndroidManifest.xml的application标签中增加一个值等于“true”的android:largeHeap属性来通知Dalvik虚拟机应用程序需要使用较大的Java Object Heap。事实上,在内存受限的手机上,即使我们将一个应用程序的android:largeHeap属性设置为“true”,也是不能增加它可用的Java Object Heap的大小的,而即便是可以通过这个属性来增大Java Object Heap的大小,一般情况也不应该使用该属性。为了提高系统的整体体验,我们需要做的是致力于降低应用程序的内存需求,而不是增加增加应用程序的Java Object Heap的大小,毕竟系统总共可用的内存是固定的,一个应用程序用得多了,就意味意其它应用程序用得少了。
  9. JNI与NDK
    JNI是java调用C/C++层,JVM和dalvik都有这个能力。不同的在于,为了方便开发者使用C/C++语言来开发应用程序,Android官方提供了NDK。通过NDK,我们就可以使用JNI机制来在Java函数中调用到C/C++函数。不过Android官方是不提倡使用NDK来开发应用程序的,这从它对NDK的支持远远不如SDK的支持就可以看得出来。

##二.ART虚拟机
###1.概念

###2.与Dalvik对比

  1. dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大用个比喻来说就是,骑自行车dalvik 是已经折叠起来的自行车,每次骑都要先组装自行车才能骑。ART是已经组装好的自行车,每次骑直接上车就能走人。
      要弄清ART和Dalvik的区别 ,首先要清楚apk文件的构成,apk包中除了一堆资源,还有一个重要文件classes.dex,此文件由java字节码优化打包而成,在Dalvik中,每次打开应用的时候,Dalvik会读取这个classes.dex并解释执行(实际情形,还可能先被转换成odex文件,在此忽略);而在ART环境下,当你安装apk的时候,这个classes.dex文件就会被转换成本地机器码——后缀为oat的文件,以后打开应用时直接读取oat文件执行即可。
      举一个不是很恰当的例子:目前国际通行的论文语言都是英文(相当于java字节码),而你作为一个中国人只会中文(相当于arm架构的Android手机),而另一个日本人只会日语(相当于x86架构的Android手机),现在给你一堆英文资料,Dalvik的做法就是将这些资料整理归档,等你需要查找资料时再从书架上找出需要的部分,然后翻译为中文阅读;而ART的做法就是先将所有资料全部翻译为中文单独保存,等你需要时直接找中文资料就可以了。
      所以,ART的优点就是大大提高了执行效率,但是缺点也很明显,一是安装耗时更长,一是占用更多磁盘空间。

  2. ART拥有改进的GC(垃圾回收)机制:GC时更少的暂停时间、GC时并行处理、某些时候Collector所需时间更短、减少内存不足时触发GC的次数、减少后台内存占用。
      首先介绍下dalvik的gc的过程.主要有有四个过程:
    1)当gc被触发时候,其会去查找所有活动的对象,这个时候整个程序与虚拟机内部的所有线程就会挂起,这样目的是在较少的堆栈里找到所引用的对象.需要注意的是这个回收动作是和应用程序同时执行(非并发).
    2)gc对符合条件的对象进行标记
    3)gc对标记的对象进行回收
    4)恢复所有线程的执行现场继续运行
      dalvik这么做的好处是,当pause了之后,gc势必是相当快速的.但是如果出现gc频繁并且内存吃紧势必会导致ui卡顿,掉帧.操作不流畅等.
      后来art改善了这种gc方式(也是想对ui流畅度做贡献,当然关于ui流畅,5.0以上了新的并行ui线程),主要的改善点在将其非并发过程改变成了部分并发.还有就是对内存的重新分配管理
    当art gc发生时:
    1)gc将会锁住java堆,扫描并进行标记
    2)标记完毕释放掉java堆的锁,并且挂起所有线程
    3)gc对标记的对象进行回收
    4)恢复所有线程的执行现场继续运行
    5)重复2-4直到结束
      可以看出整个过程做到了部分并发使得时间缩短.据官方测试数据说gc效率提高2倍。

##三.更多资料

1.Dalvik虚拟机简要介绍和学习计划:
http://blog.csdn.net/luoshengyang/article/details/8852432

android虚拟机详解相关推荐

  1. Android 多线程详解

    Android 多线程详解 一.多线程介绍 在学习多线程之前我们首先要了解几个与多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中 ...

  2. 学习Android从0开始之开发工具篇-Android studio详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android studio详解 我们古人又云:工欲善其事,必先利其器. 1.android studio的背景 Android Studio 是 ...

  3. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

  4. Android菜单详解——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  5. Android LayoutInflater详解

    Android LayoutInflater详解 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类 似于findViewById().不同点是LayoutInflater是用来 ...

  6. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  7. android Fragments详解

    android Fragments详解一:概述 android Fragments详解二:创建Fragment 转载于:https://my.oschina.net/liangzhenghui/blo ...

  8. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  9. android WebView详解,常见漏洞详解和安全源码(上)

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...

最新文章

  1. 获取android应用签名证书(打包APK用到的那个文件)的SHA1,MD5,SHA256值
  2. AI 质检学习报告——实践篇——第一步:python利用OpenCV打开摄像头并截图
  3. 美国GIS的19个研究方向
  4. vue 对象中数组中对象某个属性更改_vue之监听对象、对象数组的改变
  5. FPGA存储器DDR5简介
  6. 塔菲尔曲线斜率的大小_中国第一塔,与埃菲尔铁塔齐名,到底有多强悍?
  7. Java集合的ConcurrentModificationException
  8. [转]微信小程序 c#后台支付结果回调
  9. linux 6.7 ifcfg eth0,centos 的ifcfg-eth0只有只读权限,怎么修改其内容呢?
  10. 【金融量化】基金止盈止损法则
  11. 20 犹豫:灰度认知,黑白决策
  12. 硬盘分区时GPT和MBR的区别/选择
  13. 华为USG防火墙NAT
  14. 注塑工艺要考虑的7个因素,快转发收藏啦!
  15. 论文--Learning to Predict Bus Arrival Time From Heterogeneous Measurements via Recurrent Neural Networ
  16. service暴露端口的方式与代理的方式
  17. Android Killer反编译时遇到的异常
  18. STM32CubeMX 创建CustomHID设备
  19. 程序员才看得明白的面试圣经
  20. 什么灯适合学生在暑假使用?照度国AA级的舒适护眼灯

热门文章

  1. 2008年美国十大科技新闻
  2. AIDL跨进程通信和Service调用
  3. eclipse debug跳出for循环_Java Grammar:循环
  4. python跳出循环关键字_Python跳出for循环continue与break的区别
  5. js 监听屏幕转动orientationchange 获取横屏状态window.orientation 监听屏幕旋转完成 苹果手机屏幕多次旋转之后window获取的尺寸不对
  6. python k折交叉验证_机器学习之K折交叉验证
  7. win10密码忘了怎么办_OPPO Find X忘了手机密码怎么办?手机怎么解锁?
  8. 低文凭的程序员以后的出路在哪里?
  9. 高新企业申报中,税务部门都会审查哪些内容?
  10. 南京邮电大学计算机考研资料汇总