你应该知道的android虚拟机

Android系统架构

要想了解android虚拟机,我们首先看一下android的系统架构,看一下android虚拟机所处的位置。Android系统架构如下图所示,在黄色区块就是我们这次介绍的android虚拟机所处的位置,由此可以看出,android虚拟机是运行在Linux系统中,并用来执行android代码。


图1、android系统架构图

android虚拟机和JVM虚拟机

虚拟机是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

JVM虚拟机是什么?

不是真实的物理机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机。它没有寄存器,所以指令集是使用Java栈来存储中间数据,这样做的目的就是为了保持Java虚拟机的指令集尽量的紧凑,同时也便于JAVA虚拟机在那些只有很少通用寄存器的平台上实现。所以,JVM本质上就是一个程序。

Java代码执行过程


图2、Java代码编译执行

android虚拟机是什么?

是Google公司设计的用于android平台的虚拟机,google参考Java虚拟机,根据移动设备的一些特性进行优化,最终形成了android的虚拟机。android虚拟机是面向Linux,嵌入式操作系统的虚拟机,主要负责生命周期管理、堆栈管理、线程管理、安全和线程管理,垃圾回收等。android虚拟机分为Dalvik虚拟机和ART虚拟机。

android虚拟机有什么特点?

首先,android虚拟机体积小、占用内存空间小。移动设备无论是存储空间、内存资源还是电池资源都是有限的,所以就决定了该特点。

其次,基于寄存器的指令集合使得android虚拟机性能更好、执行更高效。每个进程对应一个虚拟机。最后,android虚拟机支持dex可执行文件格式。

Android 虚拟机与JVM对比

1、android虚拟机CPU指令基于寄存器的,而JVM基于栈。基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短。

2、android虚拟机执行文件为.dex,而JVM运行java字节码。

3、Dalvik可执行文件体积小。Android SDK中有一个叫dx的工具负责将Java字节码转换为Dalvik字节码。dx工具对Java类文件重新排列,消除在类文件中出现的所有冗余信息,避免虚拟机在初始化时出现反复的文件加载与解析过程。

android虚拟机进化史

最初的android系统采用的是Dalvik虚拟机,之后随着android系统的演进,出现了ART虚拟机。两者最大的区别在于,Dalvik虚拟机采用的是动态编译,而ART采用的是静态编译模式。通常,程序有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,而动态解释执行的则是一句一句边运行边翻译。

1、android 1.1 Dalvik:解释器

       最早的虚拟机,采用的是边编译,边执行。每次执行代码,都需要Dalvik将代码转化为机器指令集合,然后交给CPU去执行。

2、android 2.2 Dalvik:解释器+JIT(just-in-time)

       从android2.2之后,Dalvik虚拟机增加了JIT编译技术,主要为了提高android程序的运行效率。执行过程中,每遇到一个新的类别,都会被编译优化成相当精简的原生型指令码,下次执行到相同逻辑的时候,速度就会更快。最开始指在执行前编译,但是到现在已经发展成为,一开始解释执行,只有被多次调用的程序段才被编译,编译后存放在内存中,下次直接执行编译后的机器码。在引入JIT之后,android程序运行效率比之前提升了3-6倍,Google公布的测试数据。

       JIT编译产生的机器指令保存在内存中,不会进行持久化存储,所以应用每次启动都会重新进行编译。

       Dalvik虚拟机执行程序dex文件前,系统会对dex文件做优化,生成可执行文件odex,保存到data/dalvik-cache目录。

       正常的执行流程,安装APK,将dex文件通过Dx工具转化为odex文件,启动APP的时候,采用JIT技术将odex字节码转化为机器指令,CPU执行。


3、android 4.4 ART虚拟机(Android Runtime)

在android kitkat 4.4,google为了提高应用运行时的性能,于是在该版本中出现了就art虚拟机,当然默认的还是Dalvik虚拟机。ART 引入了预先编译机制,可提高应用的性能。ART 还具有比 Dalvik 更严格的安装时验证。

Art采用的是AOT模式,AOT(Ahead-of-time)即在应用安装的时候,dex文件就会被预先编译可执行文件,这个过程就叫做预编译。具体过程,安装APK的时候调用dex2oat,把.dex文件编译oat文件并保存到磁盘中,该文件采用的是成ELF文件格式,该文件格式为native code机器可以直接运行的格式,每次应用启动不用重新编译。所以每次应用启动的时候,启动速度有很大提升,增加了存储空间的使用,也是一种空间换时间的策略,但是安装过程中耗时增加。同时,AOT对Garbage collection过程也进行了改进,但是这样在手淘这样大的app环境下,第一次安装需要1-2min之久,但是在运行时,执行的都是预选编译好的机器码,所有会快很多。Android 5.0之后系统虚拟机彻底切换为ART虚拟机。

ART也在垃圾回收方面的优化,垃圾回收 (GC) 会耗费大量资源,这可能有损于应用性能,导致显示不稳定、界面响应速度缓慢以及其他问题。ART 通过以下几种方式对垃圾回收做了优化:

a.大多采用并发设计,具有一次 GC 暂停

b.并发复制,可减少后台内存使用和碎片

c.GC 暂停的时间不受堆大小影响

d.在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短

e.优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见

4、android 7.0 AOT+解释执行+JIT

为了解决在art上的安装时间太长的问题,同时保证在启动APP的时候性能不变,从android7.0开始采用混合模式,即AOT+JIT+解释执行3种模式共存的方式。具体的工作过程如下,首先,在应用安装时dex文件不会被预先编译成机器码。然后,在App运行时,dex文件先通过解释器直接执行,热点函数会被识别并被JIT编译后存储在JIT code cache中并生成profile文件记录热点函数信息。最后当手机进入idle状态或者充电状态,系统扫描app目录下的profile文件进行AOT编译。在这种模式下,无论是首次安装还是APP启动都能够保证很好的效率。


5、android 8.0 ART改进

新的并发压缩式垃圾回收器(GC)。该回收器会在每次执行 GC 时以及应用正在运行时对堆进行压缩,且仅在处理线程根时短暂停顿一次。

开发和调试方面的优化,ART 提供了大量功能来优化应用开发和调试。支持采样分析器,可更准确地了解应用执行情况,而不会明显减慢速度。ART 支持许多新的调试选项,特别是与监控和垃圾回收相关的功能。

引用:

1、百度百科JIT:https://baike.baidu.com/item/JIT%E7%BC%96%E8%AF%91%E5%99%A8/3793585?fr=aladdin

2、https://source.android.com/devices/tech/dalvik

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

推荐阅读更多精彩内容