Android 进阶解密笔记-DVM与JVM

在这里插入图片描述

DVM与JVM区别

基于的架构不同

jvm基于栈则需要从栈中读写数据,所需的指令会更多,这样导致运行速度慢,这对于性能有限的移动设备不合适。DVM是基于寄存器的,它没有基于栈的虚拟机在复制数据时而使用大量的出入栈指令,同时指令更加紧凑,简单,基于寄存器的指令要大,但是指令数量减少,总的代码数并不会增加多少

执行的字节码不同

Java类被编译成一个或多个.class文件,并打包成jar文件,然后JVM会通过相应的.class文件与jar文件获取相应的字节码。执行顺序.java文件->.class文件->.jar文件,而DVM会用dx工具将所有的class文件转换成.dex文件,然后它会从该.dex文件中读取指令与数据。执行顺序.java文件->.class文件->.dex文件

.jar文件中包含多个.class文件,每个.class文件又包含该类的常量池、类信息属性等。当JVM加载该类的jar文件时候,会加载里面所有的.class文件。加载很慢。而.apk文件中只包含一个.dex文件,这个.dex文件将所有的.class文件整合了,这样加载就加快了速度。dex工具会去除冗余的信息,并把所有的.class文件整合到.dex文件中,减少了I/O操作,加快了类的加载速度。

DVM允许在有限的内存中同时运行多个进程

Android中,每个应用都运行在一个DVM实例中,每个该实例都运行在一个独立的进程空间中,可以防止虚拟机崩溃时候所有程序关闭

DVM由Zygote创建于初始化

Zygote是一个DVM进程,同时用来创建于初始化DVM实例。每当系统需要创建一个应用程序时,Zygote就会fork自身,快速创建和初始化一个DVM实例,用于应用程序的运行。对于一些只读的系统库,所有DVM实例都会和Zygote共享一块内存区域,节省内存开销

DVM拥有共享机制

它拥有预加载共享机制,不同应用之间在运行时可以共享相同的类。而JVM没有共享机制,不同程序打包后都是彼此独立的

DVM早期没有使用JIT编译器

JVM使用了JIT编译器,而DVM是在Android2.2开始使用的,它对多次运行代码进行编译,生成相当精简的本地机器码,这样下载执行到相同的罗技时候,直接编译机器码,不是每次都需要编译。

ART与DVM区别

ART`虚拟机是`Android4.4`发布的,从`Android5.0`开始默认采用`ART
  1. DVM每次运行时,都需要编译成机器码,运行效率低下,而ART中,系统在安装应用程序时会进行一个AOT(预编译),将字节码编译成机器码并存储在本地,这样运行效率大大提升,但是设备耗电增加。采用AOT编译会造成程序安装时间变长与存储空间增加

Android7.0 ART加入了编译器JIT,作为AOT的补充,在应用程序安装时并不会将字节码全部编译成机器码,而是在运行中将多次运行的代码编译成机器码,从而缩短时间与节省空间

  1. DVM为32位CPU设计,而ART同时支持32与64位
  2. ART对垃圾回收进行改进,将GC暂停由两次减少为1次
  3. ART运行时候堆空间划分与DVM不同

DVMART都是在Zygote进程中诞生的,这样Zygote就持有它们的实例,此后Zygote通过fork自身创建应用程序进程时候,应用程序进程也得到了DVMART实例,这样就无需每次启动应用程序进程都要创建,加快应用程序进程的启动速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值