Jvm和Dalvik和ART

本文参考了奔跑吧李博和guanpj的博客,如有侵权,请通知删除。

定义

JAM: JVM(Java Virtual Machine)是一种软件实现,执行像物理程序的机器。JVM并是不专为Java所实现运行的,只要其他编程语言的编译器能生成Java字节码,那这个语言也能实现在JVM上运行。因此,JVM通过执行Java bytecode可以使java代码在不改变的情况下在各种硬件之上。常用的一句话:一处编译多处运行。
Dalvik: Dalvik虚拟机是基于apache的java虚拟机,并被改进以适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调试管理,安全和异常管理,垃圾回收等重要功能。
ART: ART虚拟机是Google在Android5.0系统发布的新型虚拟机,它采用了AOT(Ahead Of Time,预编译技术)预编译模式,在应用安装的时候将代码编译成机器本地码进行存储,从而大大增加了应用的使用体验。

Dalvik 和 JVM的差别

  1. Dalvik 基于寄存器,编译的时候,花费的时间短。JVM 基于栈,出栈、压栈,花费CPU时间长。
  2. Dalvik程序编译后的自己码全部打包到一个.Dex(Dalvik Executable文件,这个文件包含了程序中所有的类。JVM字节码由.class文件组成,每个文件一个class,JVM在运行的时候为每一个类装载字节码。
  3. Dalvik可执行文件体积小,VM 可执行文件体积大。

此外,Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Dalvik虚拟机在android2.2之后使用JIT (Just-In-Time)技术,与传统JVM的JIT并不完全相同, 
Dalvik虚拟机有自己的 bytecode,并非使用 Java bytecode。
还有以下几点:

  1. Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
  2. Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
  3. 不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex。
  4. dex文件格式可以减少整体文件尺寸,提高I/O操作的类查找速度。
  5. 所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。
  6. 所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。
  7. 有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化、库的加载、预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的速度提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

ART 和 Dalvik的差别

因为Dalvik执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后再执行,而且每次程序启动的时候都需要重新器解释编译执行,因此,采用了JIT的Dalvik虚拟机的总体性能很是差劲,相比以前使用Android4.4和之前的版本系统的你肯定有过这种体验。
在Android4.4之后,Google用ART虚拟机代替了Dalvik虚拟机,因为ART使用了AOT编译器,所以在应用程序安装的时候就将dex文件编译成了本地机器码并存储起来,下次打开应用程序的时候,就会直接执行本地机器码。
对此,ART的优点:

  1. 系统性能显著提升
  2. 应用启动更快、运行更快、体验更流畅、触感反馈更及时
  3. 续航能力提升
  4. 支持更低的硬件

但是它也是有缺点的:

  1. 更大的存储空间占用,可能增加10%-20%
  2. 更长的应用安装时间

你可能感兴趣的:(个人小结,Android)