1.DVM(Dalvik Virtual Machine)概述
  • 是Google公司自己设计用于Android平台的Java虚拟机
  • 支持已经转化为.dex(及Dalvik Excutable)格式的Java应用程序的运行
    • .dex格式是专为Dalvik设计的一种压缩格式,可以减少整体文件尺寸(对比?),提高I/O操作的类查找速度,所以适合内存和处理器速度有限的系统
 
2.DVM和标准的Java虚拟机(JVM)之间的区别
  • 数据结构不一致
    • DVM——基于寄存器
      • 基于寄存器的方式,对提前优化(ahead-of-time optimization)提供了很好的支持,移动设备属于受限环境,提前优化非常重要
      • 基于寄存器的虚拟器,对于更大的程序来说,他们编译花费的时间更短
    • JVM——基于栈
    • 思考——寄存器&栈之间的区别?
      • 寄存器——是中央处理器内的组成部分。是有限贮存容量的告诉存储部件,可以用于暂存指令、数据和地址。(更加底层)
      • 控制部件——IR(指令寄存器)&PC(程序计数器)
      • 算数及逻辑部件——ACC(累加器)
    • 栈——线程独有的,保存期运行状态和局部变量(多线程中局部变量是相互独立的,不同于类变量)
      • 栈在线程开始的时候初始化(Start方法)
      • 每个函数都有自己的栈,用于函数间的参数传递
      • 操作系统切换线程时候会自动切换栈,就是切换SS/ESP寄存器。
      • 栈空间不需要在高级语言显示分配和释放
  • 运行环境
    • Dalvik经过优化,运行在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。
      • 独立进程可以防止在虚拟机崩溃的时候所有程序都被关闭。(一个程序的闪退不影响另一个程序,沙箱原理?)
      • JVM是怎么样的?
  • 运行对象不同
    • DVM——Dalvik专用文件格式.dex
    • JVM——Java字节码
 
3.DVM的设计规则
(1)每个应用程序都运行在自己的Linux空间。在需要执行应用程序时Android将启动该进程,当不需要该应用程序且系统资源分配不够时,系统自动终止该进程。
(2)每个应用程序都有自己的DVM,所以任一程序的代码与其他应用程序的代码都是互相隔离的。
(3)默认情况下,每个应用程序都分配一个唯一的Linux用户ID(所以流量监测,根据用户ID获取每个app的上行、下行流量)。所以应用程序的文件只对对应程序可见。——安全性、独立性
 
 
4.Android应用程序的编译
  • Android所有类都通过Java编译器编译,再通过AndroidSDK的“dex文件转换工具”转换为dex字节文件,再有DVM载入运行。
5.DVM特征
  • 使用专有的.dex格式
    • java类文件在编译之后,会产生至少一个的.class文件,包含大量多余信息,dex文件格式会把所有的.class文件内容整合到一个.dex文件中,减少了文件的尺寸和IO操作,也提高了类的查找速度。
    • 增加了对新操作码的支持
    • 文件结果尽量简洁,使用等长的指令,提高解析速度
    • 尽量扩大只读结构的大小,提高跨进程的数据共享——?
  • dex的优化
    • 验证dex文件中的所有类
    • 对一些特定的类和方法里面的操作码进行优化
    • 调整所有的字节序和对齐结构中的每一个域
  • 基于寄存器,代码执行效率更好(相对基于栈)
  • 每一个Android应用都允许在自己的DVM实例中。每一个DVM实例都是一个独立的进程空间,所有Android的线程都对应Linux的线程,DVM可以更多地依赖操作系统的线程调度和管理机制(二者联系?)。
  • 不同应用都是用不同的Linux用户运行以最大程度保护用户应用程序的安全性和独立性
 
参考:
http://blog.csdn.net/jyfllzy/article/details/6119568

Android DVM的更多相关文章

  1. java jvm和android DVM区别

      本文转自:http://blog.csdn.net/yujun411522/article/details/45932247   1.Android dvm的进程和Linux的进程, 应用程序的进 ...

  2. android DVM

    android 运行环境主要是虚拟机技术:Dalvik.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说 ...

  3. class 文件与dex文件区别 (dvm与jvm区别)及Android DVM介绍

    区别一:dvm执行的是.dex格式文件  jvm执行的是.class文件   android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和 ...

  4. android 常见面试题以及答案

    http://blog.csdn.net/bobo1808/article/details/6783344 1.    请描述下Activity的生命周期.2.    如果后台的Activity由于某 ...

  5. 【转】 71道经典Android面试题和答案,重要知识点都包含了

    ,,面试题1.        下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存  B.内存回收程序负责释放无用内存   C.内存回收程序允许程序员直接释放内存 ...

  6. Android面试总结 (转)

    1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指 ...

  7. 72.40个Android面试题(转载)

    1. Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持 ...

  8. 63.Android面试题精选 (转)

    1.Android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念: 答:dvm是dalivk虚拟机.每一个android应用程序都在自己的进程中运行,都拥有一个dalivk虚拟机实 ...

  9. 在帝都的Android面试感想

    #第一次面试赤子城Android开发实习生 关于面试的表现和感想 1.没有准备充分就去面试(这是大忌,也就直接决定了结果) 我去面试Android,但是却不知道很多关于Android的基础知识,就是明 ...

随机推荐

  1. oracle数据库管理系统常见的错误(二)

    oracle数据库,对于新手来说总会遇到这样的问题: 相信大家都遇到了这样的问题,说实话,我曾经就遇到过这样的问题,但是不好意思问旁边的技术大咖,都有点怀疑人生了,然后自己在网上去查找原因,结果发现, ...

  2. 基础进阶(一)之HashMap实现原理分析

    HashMap实现原理分析 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二 ...

  3. C#实现DirectShow技术开发准备

    DirectShow组件在“C:\WINDOWS\system32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一 ...

  4. 手动安装Eclipse的PyDev插件,重启无效

    想好好学习Python,又不想只用Emeditor开发,于是想到了Eclipse.之前配置过PyDev,很久没用,就放下了.这次重新配置,遇到了不少问题总结如下: 第一,使用网址自动更新.从网上搜了很 ...

  5. [转]SQL Server为啥使用了这么多内存?

    原文地址:http://support.microsoft.com/gp/anxin_techtip6/zh-cn SQL Server为啥使用了这么多内存? SQL Server的用户,常常会发现S ...

  6. Spring AMQP + Rabbit 配置多数据源消息队列

    一般在稍微大一点的项目中,需要配置多个数据库数据源,最简单的方式是用 Spring 来实现,只需要继承 AbstractRoutingDataSource 类,实现 determineCurrentL ...

  7. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

  8. 项目实战4—haproxy 负载均衡和ACL控制

     haproxy实现高级负载均衡实战 环境:随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务 ...

  9. DLL的导出函数重定向机制

    曾经,调试时跟进HeapAlloc,结果发现直接进入到ntdll的RtlAllocateHeap中,感到很有趣,就使用Dependency Walker查看kernel32.dll的导出函数,结果发现 ...

  10. Less的!important关键字

    Less的!important关键字 在调用 mixin 时,如果在后面追加 !important 关键字,就可以将 mixin 里面的所有属性都标记为 !important.如,以下Less代码: ...