ART到底是不是虚拟机?
ART到底是不是虚拟机?
https://www.zhihu.com/question/30116106
关注者
27被浏览
3,9994 个回答
当然还是一种虚拟机。他的主要工作是管理运行时类型信息,加载,卸载代码段,标记,回收内存等资源。
编译型语言如C语言是没有这些工作的。
基于ART运行的apk仍然会比编译型语言要慢。
apk代码翻译成机器码后,仍然没有直接运行,直接运行的代码仍然是ART虚拟机进程,虚拟机进程需要动态地加载机器码,执行机器码,动态地链接应用代码调用的运行时库。
ART与Dalvik相比,主要的改进是减少了字节码到机器码的翻译过程,这个优势主要体现在启动时。Dalvik本身就基于JIT,首次翻译字节码后,会把翻译好的机器码存储在缓存中,再次调用时不需要再次翻译。而ART的优势是在安装apk应用时完成所有的翻译工作,直接保存机器码。运行时直接动态加载。
与C语言代码相比,ART仍然要多做很多事情,首先是内存回收。其次,由于应用程序所依赖的运行时库的代码可能不在内存中,运行前需要经历代码加载过程,即使已经在内存中,也还需要进行地址计算。大量的加载和地址映射会显著影响运行性能。对于C语言来说,编译时大量的静态库已经链接起来,地址已经确定,内存分配过程也没有引用计数器的管理。
另外,Java语言本身有很多机制是需依赖运行时信息的,比如instanceof这样的关键字,在AOT编译时无法直接对应到机器码,需要调用ART虚拟机存储的运行时信息。这样的运行时信息的存储与更新也是一笔很大的开销。而C语言没有运行时信息,不会有这样的开销。
总的来说,ART虚拟机类似于在一个通用的进程中频繁地调用loadlibrary以运行整个应用程序。而C语言代码则在编译时链接了大部分代码,而很少调用loadlibrary,也没有内存回收机制。
ART虚拟机会把class中的method都预先编译成机器码。但是光有这些机器码程序是跑不起来的,还需要有ART的Runtime,加载各种其它的数据和信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决