Android虚拟机Dalvik和ART详解
App安装时不编译代码只校验合法性,运行时通过解释器执行,将运行频繁的代码进行编译放到内存缓存并且记录在本地配置文件,后台线程编译配置文件记录的方法存放到.odex文件,再次运行App时优先读.odex文件中编译后的代码,然后重复这个过程。
Android应用用JAVA/Kotlin编写,Android虚拟机并不使用JVM字节码,而是将Class文件通过DX编译器编译程dex文件,然后由虚拟机执行;
底层眼里无论是java还是kolin,最终都是机器码运行;
不废话,开始介绍
一、Dalvik简单介绍1、Dalvik虚拟机介绍
Dalvik是google公司自己设计用于Android平台的虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且 每一个Dalvik 应用作为一个独立的linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
2、Dalvik诞生消亡史
- Android 1.0,使用Dalvik作为Android虚拟机运行环境。
- Android 2.2,Google在Andriod虚拟机中加入了JIT编译器。
- Android 4.4,Google带来了全新的虚拟机运行环境ART,此时ART和Dalvik是共存的,用户可以在两者之间进行选择。
- Android 5.0,ART全面取代了Dalvik成为了Android虚拟机运行环境,至此Dalvik退出历史舞台。
- Dalvik虚拟机运行的是Dalvik字节码,Dalvik字节码由Java字节码转换而来,并被打包到一个dex文件中。而JVM运行的是class文件或jar文件;
- 加载速度快,dex相比于Jar文件会把所有包含的信息整合在一起,减少了冗余信息。这样就减少I/O操作,提高类的查找速度。
- Dalvik虚拟机是基于寄存器,而JVM是基于栈(操作数栈)。虽然基于寄存器执行效率好,但是可移植性差,难跨平台。
- Dalvik虚拟机允许在有限的内存中同时运行多个进程,每一个应用都运行在一个Dalvik虚拟机实例中,拥有独立的进程空间。
- Dalvik虚拟机有共享机制,不同应用之间在运行时可以共享相同的类,拥有更高的效率。
- ART虚拟机在Android 5.0开始替换Dalvik虚拟机。其处理应用程序执行的方式不同于Dalvik虚拟机,它不使用JIT而是使用了AOT(Ahead-Of-Time),也就是提前编译技术。并且对垃圾收集器也进行了改进和优化。
- ART虚拟机由Android4.4被引入成为可选项,在Android5.0之后替换掉了Dalvik,并且在Android7.0和8.0分别进行了一系列改动。
- .dex文件:App所有java源代码编译后生成众多class文件,由DX/D8,编译为一个/多个(multiDex)dex文件,由Android虚拟机编译执行。
- .odex文件:dex文件经过验证和优化后的产物,art下的odex文件包含经过AOT编译后的代码以及dex的完整内容,但Android8.0之后odex中的dex内容移动到了.vdex文件。
- .art文件:art下根据配置文件生成odex文件时同时生成.art文件,主要是为了提升运行时加载odex中热点代码的速度,包含了类信息和odex中热点方法的索引,运行App时会首先根据这个文件来加载odex中已经编译过的代码。
- 解释器(Interpreter):用于程序运行时对代码进行逐行解释,翻译成对应平台的机器码执行。
- JIT编译(Just In Time):由于解释器方式运行太慢引入,对于频繁运行的热点代码(判定标准一般是在某个时间段内执行次数达到某个阈值)进行实时编译(在ART下以方法为粒度)执行,并且缓存JIT编译后的代码在内存中用于下次执行。由于以方法为粒度(ArtMethod)进行编译,JIT编较于解释器可以生成效率更高的代码,运行更快。
- AOT编译(Ahead-Of-Time):应用安装时全量编译所有代码为本地机器码,运行时直接执行机器码。
(1)4.4~7.0
最开始ART只采用AOT编译,在App安装时就编译所有代码存储在本地,打开App直接运行,这样做的优点是应用运行速度变快,缺点也很明显,App安装时间明显变长,而且占用存储空间较大
7.0
Android N之后对于ART进行改动,重新引入了JIT编译,结合使用AOT/JIT混合编译,主要机制如下:
- 安装时不进行任何编译,前几次运行仅通过解释器解释运行,同时对热点代码进行JIT编译,并将这些代码的相关信息记录在一个配置文件里
- 设备处于空闲和充电状态时,编译守护进程读取配置文件对热点代码进行AOT编译并写入到app对应的odex文件中
- 再次启动应用后优先使用AOT编译过的代码,否则使用解释器+JIT编译,重复这个过程
- 对于一些庞大的APP,比如某宝,有些功能可能你一辈子都不会用到,根据上述策略这部分代码就不会被编译保存,从而减少了存储空间的占用。另外,在系统升级时也避免了全量编译所有现存应用造成的时间空间消耗。
8.0
Android 8.0引入了.vdex文件,它里面包含 APK 的未压缩 DEX 代码,以及一些用于加快验证速度的元数据.
4、ART垃圾收集器优化
- 只有一次GC暂停。
- 并发复制,可减少后台内存使用和碎片。
- GC暂停的时间不受堆大小影响。
- 在清理最近分配的短时对象这种特殊情况中,回收器的总GC时间更短。
- 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得GC_FOR_ALLOC事件在典型用例中极为罕见。
- Android 4.4 ,ART和Dalvik是共存的,用户可以在两者之间进行选择。
- Android 5.0,正式取代Dalvik虚拟机成为Android虚拟机运行环境,Dalvik退出历史舞台,AOT取代JIT。
- Android 7.0,JIT回归,采用JIT和AOP混合编译模式。
- ART持续更新优化
- ART早期使用AOT技术,后期使用AOT+JIT混合,而Dalvik使用JIT。
- ART支持64位CPU并兼容32位CPU,而Dalvik只支持32位CPU。
- ART对垃圾收集器进行了改进优化,提高了吞吐量。
核心内容就一句话:App安装时不编译代码只校验合法性,运行时通过解释器执行,将运行频繁的代码进行编译放到内存缓存并且记录在本地配置文件,后台线程编译配置文件记录的方法存放到.odex文件,再次运行App时优先读.odex文件中编译后的代码,然后重复这个过程。
您可能感兴趣的文章
- 苹果手机究竟换原厂还是换第三方电池划算
苹果手机发展到今天,各方面都有了质的飞跃,已经非常完美,但也有困扰人们的不足之处,那就是苹果电池的使用寿命,通过大家的反馈可以看出,网友对电池的使用寿命褒贬不一,就说我的xr吧,电池使...
2023-09-26 16:32:40 - 购机推荐合集来了!各个价位段都有
后台时不时有狐友让我们推荐手机。讲真,现在的手机市场机海战术盛行,对于了解不多的朋友还是比较难选的。 所以,今天果子就带着购机推荐合集来了!各个价位段都有,无推广,请放心食用。文章很...
2023-09-26 16:03:38 - 泡泡玛特城市乐园正式开园首日即成人气最热品
9月26日,国内首个潮玩行业沉浸式IP主题乐园——泡泡玛特城市乐园正式在北京朝阳公园开园。开园首日,泡泡玛特城市乐园吸引了大量游客前来体验,四大核心区域人气火爆,游客热情满满、欢乐指数...
2023-09-26 15:57:03 - 为什么越来越多汽车客运站停运,如何转型
近年来,随着交通基础设施建设日益完善和私家车普及,汽车客运市场发展遭遇“寒冬”,多地汽车客运站宣布停止运营或搬迁转并。作为城乡客运车辆出行的重要基础设施,汽车客运站在很长一段时间里发挥...
2023-09-26 15:01:01 - iPhone提示发热怎么办?炎热的夏天里如
春姑娘走远了,夏天即将来临,很多用iphone的小伙伴们又要开始担心自己的手机开始发热发光了~iPhone真的是一款很容易受到天气影响的手机,在寒冷的冬天,iPhone会自动关机;在缤...
2023-09-26 14:24:09 - 小米10可免费领一年1T云空间+全家桶会员
今天发现一个小米10系列的免费福利,这个福利可能从一开始就有,但被我忽略了,如果和我一样也没有领取的,现在还是可以补上的! 这项福利中包括:小米一年的1T云空间,以及小米阅读、小米音...
2023-09-26 13:23:12 - Q2手机数据:10个人里有5个人用的华为,
2020年全球大环境波诡云谲,这为手机市场带来不可估量的影响,上半年全球手机销量大幅下滑,国内市场亦然。近日Counterpoint数据调研公司发布《2020年第二季度国内智能手机市场...
2023-09-26 12:26:43 - 游客引来蝴蝶落满身,网友调侃男版香妃
近日,网友分享的视频,在山东临沂的萤火虫水洞景区里一群蝴蝶纷纷落在一位男游客的身上,引发了众多网友的关注和热议。有人调侃说,这是让蝴蝶爱上的男人。对于这种现象,萤火虫水洞景区的工作人员...
2023-09-26 12:02:22 - 5G网络切片概述
网络切片NetworkSlice 在5G系统中,网络将被进一步抽象为网络切片mdash;NetworkSlice:这种连接服务是通过许多定制软件实现的功能定义。这些软件功能包括地理覆...
2023-09-26 11:45:08 - 滴滴出行司机端安卓和苹果的都是这样下载的,
对于目前的网约车司机,大多数人会选择注册滴滴。毕竟,滴滴品牌的领先地位一直无法动摇,滴滴打车司机版App下载虽然无法完成,尽管滴滴现在是处于下架状态,但是好像丝毫不影响它的日叫车量和司...
2023-09-26 11:43:21
精彩推荐
-
本周FAMI通新作评分《八方旅人2》36分
2023-02-22
-
《2022年中国电竞产业报告》发布,电竞产业收入五
2023-02-22
-
最新中国手游出海收入排行榜公布,《原神》仍占榜首
2023-02-22
-
开放大省亮出“成绩单”和“任务书”
2023-02-21
-
“人形机器人第一股”背后:“硬科技”没有风口
2023-02-21
-
饿了么到店业务将与高德合并,本地生活业务又将迎来血
2023-02-21
-
联想第三财季营收净利双降PC出货量减少近三成
2023-02-21
-
机器人产业蓬勃发展中国“智造”春潮涌动
2023-02-21