前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 进阶解密笔记-DVM与JVM

Android 进阶解密笔记-DVM与JVM

作者头像
Yif
发布2019-12-26 15:01:21
7180
发布2019-12-26 15:01:21
举报
文章被收录于专栏:Android 进阶Android 进阶

摘抄自<<Android 进阶解密>>一书

DVM运行时堆使用了标记清除算法进行GC

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实例,这样就无需每次启动应用程序进程都要创建,加快应用程序进程的启动速度。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年7月18日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DVM与JVM区别
    • 基于的架构不同
      • 执行的字节码不同
        • DVM允许在有限的内存中同时运行多个进程
          • DVM由Zygote创建于初始化
            • DVM拥有共享机制
              • DVM早期没有使用JIT编译器
              • ART与DVM区别
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档