Dalvik虚拟机、ART虚拟机

举报
yd_221104950 发表于 2020/12/02 23:07:35 2020/12/02
【摘要】 Dalvik虚拟机 Dalvik虚拟机是Google区Android平台开发的虚拟机,它是Adnroid4.4以前的应用的解释执行器。Dalvik虚拟机并不是Java虚拟机(JVM)的替代器。 Dalvik虚拟机与Java虚拟机最大的不同就是Dalvik是基于寄存器,而Java虚拟机是基于栈的。为什么为这样呢?首先,Java高级程序语言是为了跨平台而被设计出来的,在...

Dalvik虚拟机

Dalvik虚拟机是Google区Android平台开发的虚拟机,它是Adnroid4.4以前的应用的解释执行器。Dalvik虚拟机并不是Java虚拟机(JVM)的替代器。

Dalvik虚拟机与Java虚拟机最大的不同就是Dalvik是基于寄存器,而Java虚拟机是基于栈的。为什么为这样呢?首先,Java高级程序语言是为了跨平台而被设计出来的,在运行前需要通过编译程序将Java代码翻译成中间代码(字节码)来解释执行。为了实现跨平台,生成的中间代码就没有使用寄存器,而是完全是靠堆栈来表示变量。而Dalvik一开始是为了运行在嵌入式设备上,对性能比较看重,所以采用了寄存器来表示变量,没有过多考虑跨平台的问题。

Dalvik采用了寄存器来表示变量后,JVM的字节码就无法使用了,于是Google就开了一套新的指令作为Dalvik虚拟机的中间代码,因此Android使用Dex文件格式来代替JVM的CLASS文件。Dalvik来了支持寄存器表示变量,它的指令一条需要两个字节,而JVM只需要一个字节。Dalvik中使用的寄存器,一部被映射到arm的寄存器,另一部还是用堆栈在模拟。

Dex文件格式作了如下改进:

  • 生成Dex文件时,会把所有Class文件整合到一个Dex文件中,同时对所有类进行优化合并,去除冗余的信息,这样既减少了文件的大小,又提高了类的装载速度
  • Dex文件会把每个类文件的常量池进行分解合并,最后放在一个常量池中,节约了内存的使用
  • Dex文件中所有类推字符串常量也会被整理合并成一份
  • Dex文件中的签名只有一份,验证也只有一次
  • Dalvik虚拟机为应用创建的线程都是Linux线程,通过Linux内核来管理线程,提高效率。
    垃圾回收算法一般有“标记并清理法”、“拷贝法”、”引用计数法“、"逐代回收法“。Dalvik虚拟机实现了”标记并清理法“、”拷贝法“两种算法。Dalvik默认是使用“标记清理法”来进行垃圾清理。如果要使用“拷贝法”,则需要在编译时指定编译变量WITH_COPYING_GC为true。

“标记并清理法”:在对象分配时不加干涉,会一直分配内存,直到达到上限,然后把所有无关的线程挂起,运行一个固定的垃圾回收线程回收内存。回收算法分为两步:
1.给所有不需要回收的对象做标记
2.把所有未标记的对象释放掉。

“标记并清理法”很好解决了“引用计数法“出现的”循环引用“问题,缺点是每次清理必须暂停正常的工作线程,而且回收处理的时间也比较长。暂停工作线程的原因是”标记并清理法“找到需要回收的对象需要遍历系统中所有对象来确定对象的使用情况,因此其他的工作线程必须先停止工作。

ART虚拟机

ART虚拟机相对Dalvik虚拟机而言,它的性能提升了很多,支持配置更低的设备。但是ART虚拟机会比较消耗内存,因为ART编译出来的文件会比以前大10%~20%,而且安装时间会Dalvik要长。因为应用会被编译成可执行代码,在下次执行是就不需要再解析和执行字节码了。

ART虚拟机使用的垃圾回收算法与Dalvik一样,都是”标记并清理法“。

谢谢阅读。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/101037493

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。