1、Dalvik虚拟机与Java虚拟机的最显著差别是它们分别具有不同的类文件格式以及指令集。Dalvik虚拟机使用的是dex(Dalvik Executable)格式的类文件,而Java虚拟机使用的是class格式的类文件。

一个dex文件能够包括若干个类。而一个class文件仅仅包括一个类。

因为一个dex文件能够包括若干个类。因此它就能够将各个类中反复的字符串和其他常数仅仅保存一次。从而节省了空间,这样就适合在内存和处理器速度有限的手机系统中使用。一般来说。包括有同样类的未压缩dex文件稍小于一个已经压缩的jar文件。

2、Dalvik虚拟机使用的指令是基于寄存器的,而Java虚拟机使用的指令集是基于堆栈的。

基于堆栈的指令非常紧凑,比如。Java虚拟机使用的指令仅仅占一个字节,因而称为字节码。基于寄存器的指令因为须要指定源地址和目标地址。因此须要占用很多其它的指令空间,比如,Dalvik虚拟机的某些指令须要占用两个字节。基于堆栈和基于寄存器的指令集各有优劣。一般而言,运行相同的功能,前者须要很多其它的指令(主要是load和store指令),而后者须要很多其它的指令空间。

须要很多其它指令意味着要多占用CPU时间,而须要很多其它指令空间意味着数据缓冲(d-cache)更易失效。

3、此外,另一种观点觉得。基于堆栈的指令更具可移植性,由于它不正确目标机器的寄存器进行不论什么如果。

然而,基于寄存器的指令由于对目标机器的寄存器进行了如果。因此。它更有利于进行AOT(ahead-of-time)优化。 所谓AOT,就是在解释语言程序执行之前。就先将它编译成本地机器语言程序。AOT本质上是一种静态编译,它是是相对于JIT而言的,也就是说。前者是在程序执行前进行编译。而后者是在程序执行时进行编译。执行时编译意味着能够利用执行时信息来得到比較静态编译更优化的代码,同一时候也意味不能进行某些高级优化。由于优化过程太耗时了。还有一方面,执行前编译由于不占用程序执行时间,因此。它就能够不计时间成本来优化代码。

不管AOT。还是JIT,终于的目标都是将解释语言编译为本地机器语言,而本地机器语言都是基于寄存器来执行的。因此,在某种程度来讲,基于寄存器的指令更有利于进行AOT编译以及优化。

4、无论结论怎样,Dalvik虚拟机都在尽最大的努力来优化自身,这些措施包含:

(1). 将多个类文件收集到同一个dex文件里。以便节省空间;

(2) 使用仅仅读的内存映射方式载入dex文件,以便能够多进程共享dex文件。节省程序载入时间。

(3) 提前调整好字节序(byte order)和字对齐(word alignment)方式,使得它们更适合于本地机器。以便提高指令运行速度。

(4) 尽量提前进行字节码验证(bytecode verification)。提高程序的载入速度。

(5) 须要重写字节码的优化要提前进行。

5、内存管理

Dalvik虚拟机的内存大体上能够分为Java Object Heap、Bitmap Memory和Native Heap三种。

Java Object Heap是用来分配Java对象的。也就是我们在代码new出来的对象都是位于Java Object Heap上的。Dalvik虚拟机在启动的时候,能够通过-Xms和-Xmx选项来指定Java Object Heap的最小值和最大值。

为了避免Dalvik虚拟机在执行的过程中对Java Object Heap的大小进行调整而影响性能,我们能够通过-Xms和-Xmx选项来将它的最小值和最大值设置为相等。

这个Java Object Heap的最大值也就是我们平时所说的Android应用程序进程可以使用的最大内存。这里必需要注意的是。Android应用程序进程可以使用的最大内存指的是可以用来分配Java Object的堆。

在HoneyComb以及更高的版本号中,Bitmap Memory就直接是在Java Object Heap中分配了,这样就能够直接接受GC的管理。

Native Heap就是在Native Code中使用malloc等分配出来的内存。这部分内存是不受Java Object Heap的限制大小的,也就是它能够自由使用。当然它是会受到系统的限制。可是有一点须要注意的是。不要由于Native Heap能够自由使用就滥用,由于滥用Native Heap会导致系统可用内存急剧降低,从而引发系统採取激进的措施来Kill掉某些进程,用来补充可用内存。这样会影响系统体验。

6、垃圾收集

Dalvik虚拟机能够自己主动回收那些不再使用了的Java Object,也就是那些不再被引用了的Java Object。垃圾自己主动收集机制将开发人员从内存问题中解放出来。极大地提高了开发效率,以及提高了程序的可维护性。

在GingerBread以及更高的版本号中,Dalvik虚拟使用的垃圾收集机制得到了改进,例如以下所看到的:

(1) Cocurrent,也就是大多数情况下,垃圾收集线程与其他线程是并发运行的;

(2)Partial collection,也就是一次可能仅仅收集一部分垃圾;

(3)一次垃圾收集造成的程序中止时间通常都小于5ms。

7、进程和线程管理

一般来说,虚拟机的进程和线程都是与目标机器本地操作系统的进程和线程一一相应的,这样做的优点是能够使本地操作系统来调度进程和线程。进程和线程调度是操作系统的核心模块,它的实现是很复杂的,特别是考虑到多核的情况,因此,就全然没有必要在虚拟机中提供一个进程和线程库。

Dalvik虚拟机执行在Linux操作系统之上。

我们知道,Linux操作系统并没有纯粹的线程概念,仅仅要两个进程共享同一个地址空间,那么就能够觉得它们同一个进程的两个线程。Linux操作系统提供了两个fork和clone两个调用。当中,前者就是用来创建进程的,而后者就是用来创建线程的。

关于Android应用程序进程,它有两个非常大的特点。以下我们就简要介绍一下。

第一个特点是每个Android应用程序进程都有一个Dalvik虚拟机实例。这样做的优点是Android应用程序进程之间不会相互影响,也就是说,一个Android应用程序进程的意外中止。不会影响到其他的Android应用程序进程的正常执行。

第二个特点是每个Android应用程序进程都是由一种称为Zygote的进程fork出来的。Zygote进程是由init进程启动起来的,也就是在系统启动的时候启动的。Zygote进程在启动的时候。会创建一个虚拟机实例,并且在这个虚拟机实例将全部的Java核心库都载入起来。每当Zygote进程须要创建一个Android应用程序进程的时候。它就通过复制自身来实现,也就是通过fork系统调用来实现。

这些被fork出来的Android应用程序进程,一方面是复制了Zygote进程中的虚拟机实例,还有一方面是与Zygote进程共享了同一套Java核心库。这样不仅Android应用程序进程的创建过程非常快,并且因为全部的Android应用程序进程都共享同一套Java核心库而节省了内存空间。

摘至:http://blog.csdn.net/luoshengyang/article/details/8852432

Android 虚拟机学习总结Dalvik虚拟机介绍相关推荐

  1. JVM(JAVA虚拟机)、DVM(Dalvik虚拟机)和ART虚拟机

    一.什么是DVM,和JVM有什么不同? JVM是Java Virtual Machine,而DVM就是Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进 ...

  2. 【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )

    文章目录 一.Dalvik 虚拟机简介 二.CPU 指令集 三.Dalvik 虚拟机内存 一.Dalvik 虚拟机简介 Android 5.05.05.0 之前使用的是 Dalvik 虚拟机 , 5. ...

  3. 【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )

    文章目录 前言 一.打包 Jar 文件和 Dex 文件 1.示例代码 2.打包 Jar 文件 3.打包 Dex 文件 二.反编译 Dex 文件 三.分析 Dex 文件 1.Student 类相关信息 ...

  4. 老郭的《Dalvik虚拟机垃圾收集机制简要介绍和学习计划》

    伴随着"Dalvik is dead,long live Dalvik"这行AOSP代码提交日志,在Android5.0中,ART运行时取代了Dalvik虚拟机.虽然Dalvik虚 ...

  5. android dalvik虚拟机,Android开发环境搭建之Dalvik虚拟机

    原标题:Android开发环境搭建之Dalvik虚拟机 由于大多数用户使用Java编写Android应用程序,一个显而易见的问题是:Android是否提供Java虚拟机?答案是没有,Android不提 ...

  6. Android安全与逆向之Java虚拟机和Dalvik虚拟机的区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

  7. (Android)java虚拟机和Dalvik虚拟机的区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

  8. Android Dalvik虚拟机之Dalvik虚拟机的特点

    Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野.它的作者是丹.伯恩斯坦(Dan Bornstein).Dalvik虚拟机作为Android平台的 ...

  9. Dalvik虚拟机垃圾收集(GC)过程分析

    前面我们分析了Dalvik虚拟机堆的创建过程,以及Java对象在堆上的分配过程.这些知识都是理解Dalvik虚拟机垃圾收集过程的基础.垃圾收集是一个复杂的过程,它要将那些不再被引用的对象进行回收.一方 ...

最新文章

  1. 基于 Laravel、Vue.js开发的全新社交系统----ThinkSNS+
  2. 并发和在线用户数的思考
  3. 吉林大学数据结构(C++版)
  4. C# 3.0新特性之扩展方法
  5. 《Python游戏编程快速上手》第三章-猜数字游戏
  6. 洛谷 1057——传球游戏(递推与递归二分)
  7. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1098:质因数分解
  8. HTTP POST GET 本质区别详解(转)
  9. 对象构造函数的原型图
  10. Windows 8 系列(九):关于VariableSizedWrapGrid与WrapGrid 对Visibility变化而引起的布局变化的支持...
  11. 微软Surface Pro 8曝光:搭载第11代酷睿处理器和Win11系统
  12. 【iCore3 双核心板_FPGA】例程二:GPIO输出实验——点亮三色LED
  13. 封装0805跟0603有什么区别,只存在大小的区别么???
  14. 机器学习二分类模型评价指标详述
  15. linux重装系统保留文件,linux重装系统,如何保存硬盘中的内容
  16. 从冬令营到字节跳动,我从ICPCer变身Bytedancer
  17. 2021年中考计算机考试,2021年初中信息技术考试操作题
  18. k37.第十五章 K8s运维篇-Prometheus监控 (三)
  19. 微信朋友圈为什么不能发gif图?
  20. Web全栈开发1+x(中级)PHPMySQL知识

热门文章

  1. freemaker if 多个条件_第4天|14天搞定Vue3.0,条件渲染和template
  2. java listen_Java进阶-IO基础
  3. DICOM的常用Tag分类和说明
  4. struts2+extjs文件上传完整实现(攻克了上传中的各种问题)
  5. 洛谷模板,树状数组二 差分
  6. 在原生js中的事件监听方法
  7. Golang的值类型和引用类型的范围、存储区域、区别
  8. 移动端常见的一些兼容性问题
  9. LeetCode 24 Swap Nodes in Pairs (交换相邻节点)
  10. Web测试容易忽略的地方