• Android DVM


    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
  • 相关阅读:
    三次握手与四次挥手原理
    动态主机配置协议(DHCP)
    网络知识-OSI7层模型说明和相关协议
    企业面试题合集
    优先队列(priority_queue)自定义排序方法
    优先队列(priority_queue)自定义排序方法
    C. Playlist(权值线段树查询前k大和)
    C. Playlist(权值线段树查询前k大和)
    C++判断四个点能否构成正方形/矩阵
    C++判断四个点能否构成正方形/矩阵
  • 原文地址:https://www.cnblogs.com/amyzhu/p/8060504.html
Copyright © 2020-2023  润新知