前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DVM三问—说说虚拟机

DVM三问—说说虚拟机

作者头像
码上积木
发布2020-11-24 15:26:57
8950
发布2020-11-24 15:26:57
举报
文章被收录于专栏:码上积木码上积木

上一节说了Android的五层架构,今天说说其中的Dalvik虚拟机,简称DVM。

介绍

DVM(Dalivk Virtual Machine),是Google专门为Android平台开发的虚拟机,在Android的运行时库层。

区别

DVM虽然也是编译java文件,但是和JVM还是有区别。

  • 基于架构不一样JVM基于栈,意味着需要去栈中读写数据,所需要的指令会更多,这样会导致速度变慢,对于性能有限的移动设备显然不合适。它的优点在于足够简单,跨平台,并且可以保证在低硬件条件下可以运行。

DVM是基于寄存器的,它没有基于栈的虚拟机在复制数据时而使用大量的出入栈指令,指令更紧凑、简洁。而且寄存器存储速度比栈要快的多,可以根据硬件实现最大的优化,所以就适合移动设备。

  • 执行字节码不同

JVM执行顺序:.java文件——.class文件——.jar文件DVM执行顺序:.java文件——.class文件——.dex文件

DVM会用dx工具把所有的class文件打包成一个.dex文件,然后DVM会从该.dex文件中读取指令和数据。这个.dex文件将所有的.class文件里面所包含的信息全部整合到了一起,这样加载类查找类就加快了速度。当然也带来了65535的错误,所以又使用了Multidex技术。

  • 多进程

DVM可以允许在有限的内存中同时允许多个进程,每个应用都允许在一个DVM实例中,每一个DVM实例都运行在一个独立的进程空间中,这样就能保证在DVM崩溃的时候,其他应用可以正常使用。

  • Zygote

Zygote是一个DVM进程,同时也用来创建和初始化其他DVM进程。

  • DVM共享机制

DVM拥有共享机制,也就是不同应用之间运行时可以共享相同的类,这样效率就提高了。

  • GC

DVM进行垃圾回收使用的是Mark-Sweep也就是标记清除算法,通过Mark Stack进行遍历存活的对象并标记。而大部分JVM使用的是Generational Collection,分代收集算法,主要思想是根据对象存活的生命周期将内存划分为若干个不同的区域,比如老年代和新生代。然后针对不同的区域采用不同的垃圾回收算法。

GC的原因

DVM中GC的原因主要有5种:

  • GC_CONCURRENT:当堆开始填充时,并发GC可以释放内存。
  • GC_FOR_MALLOC:当堆内存已满时,app尝试分配内存而引起的GC,系统必须停止app并回收内存。
  • GC_HPROF_DUMP_HEAP:当你请求创建 HPROF 文件来分析堆内存时出现的GC。
  • GC_EXPLICIT:显示的GC,例如调用System.gc()(应该避免调用显示的GC,信任GC会在需要时运行)。
  • GC_EXTERNAL_ALLOC:仅适用于 API 级别小于等于10 ,用于外部分配内存的GC。

总结

DVM是专门针对移动设备而生的,所以在很多地方针对移动端的平台特性进行了设计和改编。比如多进程,对应了多应用。共享机制对应了多应用中相同类运行。基于寄存器架构,提高对内存访问。整合.class文件,减少I/O操作等等。仔细想一想,都是为了移动端所设计,所以对应的也是移动端的场景。

至于为什么后面由换成了ART?我们下次再谈。

参考

https://blog.csdn.net/itachi85/article/details/73149305

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上积木 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 区别
  • GC的原因
    • 总结
      • 参考
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档