深入理解dvm和jvm

学习android想要对android的framwork或者运行机制有深入了解,dvm是一定要知道的。即使是在面试时被问起dvm和jvm也是很平常的,网上关于dvm和jvm的文章很多,但是没有一篇能把dvm的前世今生彻头彻尾的讲清的,在这里我结合网络资源和自身对编译原理以及嵌入式的理解在这里斗胆揭示下dvm的全貌,不对的地方欢迎再下方留言。

kernel启动流程

众所周知,android使用的是linux内核的,那么android和linux的关系就很微妙了;android是在linux内核的基础针对硬件和特殊的运行需求做了深度优化的,例如,对于电源管理模块、进程调度模块、内存管理模块等等,优化后的kernel可以更高效更符合用户对手机的使用习惯,以及对手机硬件的高效支持。下面正式讲讲android是如何从一个破板子,就运行起kernel了,然后又运行了android、运行了什么dvm的。。。

  1. cpu上电,运行0xFFF0地址的4k程序,4k程序将bootloader程序搬运到ram中运行,bootloader负责初始化硬件资源和加载kernel,然后将控制权交给kernel。
  2. kernel得到控制权后,开始自启。第一个执行的函数是start_kernel
  3. start_kernel中调用下列一系列函数
    page_address_init();//页表地址初始化
    sched_init();
    page_alloc_init();//内存分配初始化,请看mmu和内存管理
    init_IRQ();//中断向量初始化
    softirq_init();//软中断初始化
    console_init();//终端初始化
    calibrate_delay();
    vfs_caches_init();//虚拟文件系统(vfs)初始化
    rest_init();//这就是最后创建init0进程的函数,init0进程会创建android的受精卵进程Zygote。
    这里写图片描述
    Zygote进程启动标志着进入里android时代

kernel进程和dvm进程

kernel进程和dvm进程有什么区别?
答案是一样的。

rest_init函数都做了什么

首先完成了硬件驱动的初始化,没有硬件驱动,上层软件就是个壳子
然后启动kernel第一个进程,init进程是负责fork所有其他子进程,init进程优先级最高,为1,init进程会fork出Zygote进程;Zygote进程是android的最高级别进程,所有android的进程都是由Zygote进程fork出来的,并且android子进程都是调用dvm虚拟机运行我们的app。所以每个app都是kernel中的一个单独进程,进程之间复制复制父进程上下文,但是又不会相互干扰。
如下图所示,Fork()橙色箭头左边是Zygote进程,右边是创建出的Zygote‘子进程;然后Zygote’ 子进程将执行流程交给应用程序A,Android程序开始运行。
新生成的应用程序A会使用已有Zygote父进程的库与资源的连接信息,所以运行速度很快。
这里写图片描述

dvm和jvm区别

Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。(dx 是一套工具,可以将 Java .class 转换成 .dex 格式. 一个dex档通常会有多个.class。由于dex有时必须进行最佳化,会使档案大小增加1-4倍,以ODEX结尾。)  

1、执行的字节码不一样

jvm: java->class->jar
dvm:java->class->dex

这里写图片描述 

2、 基于的架构不一样

Java JIT(just in time)即时编译器是sun公司采用了hotspot虚拟机取代其开发的classic vm之后引入的一项技术,目的在于提高java程序的性能,改变人们“java比C/C++慢很多”这一尴尬印象。说起来是编译器,但此编译器与通常说的javac那个编译器不同,它其实是将字节码编译为硬件可执行的机器码的。

Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 JVM字节码中,局部变量会被放入局部变量表中,继而被压入堆栈供操作码进行运算,当然JVM也可以只使用堆栈而不显式地将局部变量存入变量表中。Dalvik字节码中,局部变量会被赋给65536个可用的寄存器中的任何一个,Dalvik指令直接操作这些寄存器,而不是访问堆栈中的元素。

3、Dalvik 和 Java SDK的SDK不同。

4、Dalvik 和 Java 运行环境的区别    

5、Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

6、Dalvik虚拟机在android2.2之后使用JIT (Just-In-Time)技术,与传统JVM的JIT并不完全相同, 

7、Dalvik虚拟机有自己的 bytecode,并非使用 Java bytecode。

你可能感兴趣的:(android)