Dalvik源码分析(一)虚拟机概述

Stella981
• 阅读 666

Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

主要功能:

**Dalvik源码分析(一)虚拟机概述
**

Dalvik功能图

Dalvik的主要作用是将java SDK 编译的.class文件编译成.dex文件,然后加载需要的类进行解释执行。同时对进程及内存进行管理。

Dalvik VM做了大量的优化,包括如下方面:

(1)Dex文件镜像格式采用了内容压缩技术。将多个class中的内容统一归类存储,即将方法、属性、字符串、类型均抽取出来统一存放,这样可以使所有重复的内容仅出现一次,通过引用(id)来访问。这种技术比JVM中基于zip的压缩技术更高。虽然压缩后的大小差不多,但是内容压缩无需解压缩,因此可以有效减少程序的启动时间。

(2)用Zygote统一管理VM。Android中所有应用均对应了一个VM,但是这些VM和JVM的使用方式不同,这些VM共享了应用程序中的系统代码和数据,这就类似OS中的动态Lib管理那样,同样的内容仅被加载一次,而一旦系统数据需要被某个应用修改时,则采用Copy-On-Write技术保证最少的性能开销。 这种技术不会造成Windows中的“Dll Hell”问题,因为系统库均为Dalvik提供,不会存在版本问题。但是随着应用的发展,可能会逐步出现可重用的Lib,那个时候就会有Windows曾经面临的痛苦了。

(3)Register-based VM。这个和JVM这种Stack-based VM有较大的不同。后者基于堆栈执行程序,虽然每个指令字较短,但是指令执行时却通常需要加载数据到堆栈,这就带来了更多的内存访问和更多的指令。虽然由于指令字较短,最终的程序文件大小并不比基于寄存器的程序更大。而基于寄存器的VM通常指令字较长,但是操作数通常在寄存器中,这样就提高了执行的速度。

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java常见问题整理
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令
Java层逆向分析方法和技巧
本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如有错漏,欢迎留言指正Java层逆向分析方法和技巧一、smali汇编1.Dalvik字节码java字节码、Dalvik字节码、机器码之间的关系?在Android上,Java代码首先经过编译器编译成
Stella981 Stella981
3年前
Dalvik与JVM
Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
ART运行时无缝替换Dalvik虚拟机的过程分析
  Android4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题。老罗不打算分析ART的实现原理,只是很有兴趣知道ART是如何无缝替换掉原来的Dalvik虚拟机的。毕竟在原来的系统中,大量的代码都是运行在Dalvik虚拟机里面的。开始觉得这个替换工作是挺复杂的,但是分析了相关代码之后,发现思路是
Stella981 Stella981
3年前
Dalvik虚拟机java方法执行流程和Method结构体分析
Method结构体是啥?在Dalvik虚拟机内部,每个Java方法都有一个对应的Method结构体,虚拟机根据此结构体获取方法的所有信息.Method结构体是怎样定义的?此结构体在不同的android版本稍有变化,但是结构体前面比较重要的一部分(从clazz到nativeFunc)完全没有变化.以下是android4.4.2\_r2的Me
Stella981 Stella981
3年前
Android内存分配的注意事项
在Android(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.51code.com%2F)开发中,要时刻注意内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的。这样就需要我们在开发的过程中时刻注意,不要因为自己的代码问题造成OOM。Android应用
Stella981 Stella981
3年前
Android动态加载之ClassLoader详解
Dalvik虚拟机如同其他Java虚拟机一样,在运行程序时首先需要将对应的类加载到内存中。而在Java标准的虚拟机中,类加载可以从class文件中读取,也可以是其他形式的二进制流。因此,我们常常利用这一点,在程序运行时手动加载Class,从而达到代码动态加载执行的目的。只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物
Stella981 Stella981
3年前
24个Jvm面试题总结及答案
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新