Dalvik & ART

对于Android应用层开发,底层虚拟机知识除了JVM之外,还应对Dalvik和ART有所了解,涉及的知识不多,在此进行一下归纳总结


Dalvik

1. DVM与JVM的区别

DVM之所以不是JVM,是因为其并未遵守JVM规范来实现,因此主要有以下区别

  • 基于的架构不同:JVM基于栈,读写数据时需要更多的指令,即代表速度会因此降低,对于性能有限的移动设备不太合适。DVM基于寄存器,不像JVM需要频繁的出栈入栈指令,因此指令更少更简洁,但与此同时也显示制定了操作数,所以指令会比JVM中要大,总的代码数不会增加多少

  • 执行的字节码不同:Java会被JVM编译为一个或多个".class"文件,最后打包为jar包。而Java在DVM中,会通过dx工具将所有的".class"文件转换为一个dex文件,打包为aar包。我们都知道“.jar"文件里会包含多个".class"文件,加载时需要把他们全部加载。而“.apk”文件只包含一个“.dex”文件,整合了所有".class"文件的信息,上面提到的dex工具会剔除冗余信息,减少IO操作,加快了类的加载速度


    image.png
  • DVM允许在有限内存中同时运行多个进程:DVM经过优化,允许在有限内存中同时运行多个进程。每一个app都运行在一个DVM实例中,而每一个DVM实例都运行在一个独立的进程空间,独立的进程空间可以防止虚拟机崩溃时所有程序都被关闭


    image.png
  • DVM由Zygote创建和初始化:Zygote就是一个DVM进程,同时也用于创建和初始化DVM实例,系统需要创建一个应用程序时,Zygote就会fork自身,快速创建。所有的DVM实例都会和Zygote共享一块内存区域,节省开销

  • DVM共享机制:DVM拥有预加载——共享机制,不同应用程序之间在运行时可以共享相同的类,拥有更高效率,而JVM打包后程序彼此独立,不存在这种共享机制

  • DVM早期没有使用JIT编译器:JVM使用了JIT编译器,即时编译器,而DVM早期没有使用,因此每次执行代码都需要通过解释器将dex代码编译为机器码,交给系统,效率很低。之后DVM加入了JIT,对热点代码进行编译后生成精简的本地机器码,下一次运行到热点代码时不需要编译,直接运行。需要注意的是,应用程序每次重新运行时都要重做编译工作,因此每次打开应用程序,都需要JIT编译


2. DVM架构

DVM源码部分 目录 / 文件 说明如下

  • dexdump:生成dex文件的反编译查看工具,用于查看编译出来的代码的正确性和结构

  • dexgen:dex代码生成器项目

  • docs:DVM文档

  • dx:Java字节码转换为DVM机器码工具

  • libdex:生成主机和设备处理dex文件的库

  • tools:一些反编译和运行相关工具

  • Android.mk:虚拟机编译的makefile配置文件

  • MODULE_LICENSE_APACHE2:APACHE2版权文件

  • NOTICE:虚拟机源码版权

其中,libdex会被编译为libdex.a静态库,作为dex工具使用。dexdump是反编译工具。DVM架构如图所示


image.png

3. DVM运行时堆

DVM运行时堆使用标记——清除算法进行GC,主要结构如下


image.png

ART

ART虚拟机的发布是用来替换DVM的,先来看ART和DVM的区别

1. ART与DVM的区别

  • AOT机制:ART中,系统在安装应用程序时会进行一次预编译,将字节码预先编译为机器码存储在本地,这样每次运行时都不用再次编译了,效率大大提升,ART中也加入了JIT作为AOT的补充,协同工作

  • 兼容性:DVM为32位cpu设计,而ART支持64位并且兼容32位cpu

  • 回收优化:ART对垃圾回收机制进行了改进,比如更频繁的进行垃圾收集,减少GC暂停等

  • 空间划分:ART运行时堆空间划分和DVM不同


2. ART运行时堆

与DVM的GC不同的是,ART采用了多种垃圾回收方案,每个方案会运行不同的垃圾收集器,默认采用了CMS方案,该方案主要使用sticky-CMS和partial-CMS。根据不同的方案,运行时堆也有不同的划分,默认由4个Space和多个辅助数据结构组成,具体如图


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容