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

Stella981
• 阅读 327

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通常指令字较长,但是操作数通常在寄存器中,这样就提高了执行的速度。

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
6个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
技术小男生 技术小男生
6个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
6个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
6个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
晴空闲云 晴空闲云
6个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
1年前
Android内存分配的注意事项
在Android(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.51code.com%2F)开发中,要时刻注意内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的。这样就需要我们在开发的过程中时刻注意,不要因为自己的代码问题造成OOM。Android应用
Stella981 Stella981
1年前
24个Jvm面试题总结及答案
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新
Wesley13 Wesley13
1年前
java常见问题整理
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令
helloworld_28799839 helloworld_28799839
6个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue