Moosphan/Android-Daily-Interview

2019-06-26:JVM、Dalvik、ART三者的原理和区别?

Moosphan opened this issue · 7 comments

2019-06-26:JVM、Dalvik、ART三者的原理和区别?

这个问题好难,只知道JVM是Java虚拟机规范,Dalvik是基于JVM规范实现的虚拟机其中的一种。ART没怎么了解过,不过是安卓现行版本使用的虚拟机。静等大佬的解答

没人回答吗

  • JVM:是Java Virtual Machine的缩写,其并不是指某个特定的虚拟机实现,而指任何能够运行Java字节码(class文件)的虚拟机实现,比如oracle的Hotspot VM

  • Dalvik:是Google写的一个用于Android的虚拟机,但其严格来说并不算JVM(没有遵守Java虚拟机规范,比如其字节码格式是dex而非class)
    该虚拟机在5.0时被ART替代

  • ART:是Android Runtime的缩写,严格来说并不是一个虚拟机,在4.4~6.0时采用安装时全部编译为机器码的方式实现,7.0时默认不全部编译,采用解释执行+JIT+空闲时AOT以改善安装耗时
    ART在安卓4.4时加入,5.0取代dalvik作为唯一实现直到现在。

贴两篇官方文档,有兴趣的可以看看
Java 虚拟机规范
Android Runtime (ART) 和 Dalvik

有点高深 面试的时候被问过 还是不太明白
片面理解
JVM java虚拟机
Dalvik 早期的Android虚拟机
ART 现行的Android虚拟机

jvm:Java虚拟机,能够运行Java字节码的虚拟机器
Dalvik:Android虚拟机,现在被art代替
ART:代替了原来的Dalvik,但它不算是一个虚拟机。之前是安装时全部编译,现在是采用解释执行+JIT+AOT改善安装耗时

JVM、Dalvik、ART三者的原理和区别?
JVM是指某个特定的JAVA虚拟机实现 是一个通用的范畴
Dalvik是早期用来做Android专用的虚拟机用来运行DEX格式的程序 允许运行多个虚拟机实例 每一个应用作为单独的linux进程运行 运行方式是会将dex代码转为微处理指令(边解释边执行)
也使用到了JIT(JustInTime)将代码编译成nativecode提高执行效率(运行时编译)
ART(Android Runtime)是使用了AOT(Ahead of Time)预编译在应用安装时就把字节码编译为机器码这样运行时就可以直接运行机器码执行效率更高但安装时间会慢

区别容易,说原理估计要用三篇博客来讲

1、JVM指Java虚拟机,能够运行Java字节码的虚拟机器,有多种实现

2、Dalvik虚拟机是Google设计用于Android平台的虚拟机,支持已转换为.dex格式的Java程序的运行。与JVM的区别:

  • Dalvik基于寄存器,JVM基于堆栈

  • Dalvik有自己的字节码,不使用Java字节码

  • Android2.2开始,Dalvik支持JIT即时编译

3、ART虚拟机是现行的Android虚拟机,与Dalvik的区别:

  • ART采用的是Ahead-of-time AOT预编译技术,Dalvik采用的是JIT即时编译技术

  • AOT预编译会在应用安装过程中,将所有的字节码编译成机器码,应用运行时无需实时编译了,直接调用即可

  • JIT即时编译在应用启动时,通过性能分析来优化代码的执行;在应用运行时,实时将字节码编译成机器码

所以,ART虚拟机提高了程序的运行效率;首次安装需要预编译,所以安装时间比Dalvik中略长,机器码占用空间大,应用占用空间也会略大。