• Android Dalvik虚拟机


    虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的。

    可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik Virtual Machine。

      而4.4版本的Android的「开发者选项」中已经添加了Art模式和Dalvik模式切换的功能,而前几天Google I/O宣布 下一代Android(代号L)会正式移除Dalvik。

    因为:

    • 1,ART的性能比Dalvik好
    • 2,ART对dex的检验比Dalvik严格,某些经过后处理(如混淆)的dex文件即便能在Dalvik环境正常运行,但也可能无法通过ART的检查。用于代码混淆/加密的软件可能需要针对ART做出变动。
    • 3,改进了垃圾回收
    • 4,更好的debug工具

      对于非预装软件,ART的编译是在手机端现场进行,这远比dalvik环境下制作optimized dex慢。带有大量java代码的应用(比如淘宝,比如微信,比如QQ)会受到很大影响,它们安装时间可达数十秒乃至超出一分钟。

      更多关于Dalvik与Art:Link

      Introducing ART

    -----------------------------------------------------------------

    Dalvik虚拟机概述

    Dalvik在2007年Android SDK发布的时候进入人们的实现,名字来源于作者Dan Bornstein的祖先居住过Dalvik小渔村。特点:

    1.   体积小,占用内存空间小;
    2.   专有的DEX可执行文件格式,体积小速度快;
    3.   常量池采用32位索引值,寻址更快;
    4.   基于寄存器架构(JVM基于stack),拥有完整的指令系统;
    5.   提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能。
    6.   所有的Android程序都运行在系统进程里,每一个进程对应一个Dalvik虚拟机实例。

     

    Dalvik虚拟机与Java虚拟机的区别

      Dalvik虚拟机与传统Java虚拟机并不兼容,不同点主要有:

      1.Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码

      Java虚拟机通过解码class文件中的内容来运行程序;

      Dalvik虚拟机运行的Dalvik字节码由Java字节码转换而来,并被打包成一个DEX(Dalvik Executable)可执行文件,Dalvik虚拟机通过解释DEX文件来执行这些字节码。

      2.Dalvik可执行文件体积更小

      Android SDK 中有一个叫做dx的工具负责将Java字节码转换为Dalvik字节码。

      dx对Java类文件重新排列,消除冗余信息,避免反复加载与解析。

      dx对常量池进行压缩,使相同的字符串、常量在DEX中指出现一次,减小了文件的体积。

      3.Java虚拟机与Dalvik虚拟机架构不同

      Java虚拟机基于栈架构,程序运行时需要频繁从栈上读取或写入数据,耗费不少CPU时间。

      Dalvik基于寄存器架构,数据访问直接通过寄存器传递。

      作者通过一个例子对比Java字节码与Dalvik字节码的区别:

      编译了一个Hello.class然后分别反编译成Java和Dalvik字节码:

      

      (Sony的渣相机真够屎)

      通过对比作者证明基于寄存器架构的Dalvik字节码与基于栈架构的Java字节码相比,生成的代码指令要少,执行速度会快一些。

    Dalvik虚拟机是如何执行程序的

    Android系统架构采用分层思想,好处是:

    • 减少各层之间依赖性
    • 便于独立分发
    • 容易收敛问题和错误

      Android系统由Linux内核、函数库、Android运行时、应用程序框架、应用程序 组成。

      

      Dalvik虚拟机属于Android运行时环境,它与一些核心库共同承担Android应用程序的运行工作(这个图每次看都有新理解)。

      Android系统启动加载完内核后的步骤:

    1.   执行init进程进行初始化;
    2.   读取init.rc脚本文件并启动系统中的外部程序Zygote([ˈzaɪˌɡot],受精卵)。Zygote是Android所有进程的孵化器进程;
    3.   Zygote首先初始化Dalvik虚拟机,然后启动system_server并进入Zygote模式,通过socket等候命令;
    4.   执行一个Android程序时,system_server进程通过Binder IPC方式发送命令给Zygote,Zygote收到命令后通过fork自身创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了。

      Dalvik虚拟机执行程序流程:

      虚拟机线程--->装载程序类--->验证字节码--->查找主类--->执行字节码流--->结束

    即时编译JIT

      JIT(Just-in-time Compilation,即时编译)又称动态编译,是一种通过在运行时将字节码翻译成机器码的技术,使程序执行速度更快。从Android2.2开始引入。

      JIT的两种字节码编译方式:method方式和trace方式。method方式编译整个方法的代码,是的在「冷路径」上浪费很多编译时间。trace方式更快的获取热路径的代码,效率更高。Dalvik默认采用trace方式编译。

      

  • 相关阅读:
    爬楼梯
    字母异位词分组
    发射子弹过程
    删除元素
    删除排序数组中的重复项
    JAVA编程-------------9、查找1000以内的完数
    JAVA-------------8、计算a+aa+aaa+.....
    JAVA编程----------7、统计一段字符串中的英语字母数,空格数,数字和其他字符数
    JAVA编程---------6、最大公约数和最小公倍数
    JAVA编程----------5、利用条件运算符的嵌套来完成:成绩>=90(A) 60-89(B) 60分以下(C)
  • 原文地址:https://www.cnblogs.com/larrylawrence/p/3815691.html
Copyright © 2020-2023  润新知