Android 虚拟机学习总结Dalvik虚拟机介绍

1、Dalvik虚拟机与Java虚拟机的最显著差别是它们分别具有不同的类文件格式以及指令集。Dalvik虚拟机使用的是dex(Dalvik Executable)格式的类文件,而Java虚拟机使用的是class格式的类文件

一个dex文件能够包括若干个类而一个class文件仅仅包括一个类

因为一个dex文件能够包括若干个类。因此它就能够将各个类中反复的字符串和其他常数仅仅保存一次。从而节省了空间,这样就适合在内存和处理器速度有限的手机系统中使用。一般来说。包括有同样类的未压缩dex文件稍小于一个已经压缩的jar文件。

2、Dalvik虚拟机使用的指令是基于寄存器的,而Java虚拟机使用的指令集是基于堆栈的

基于堆栈的指令非常紧凑,比如。Java虚拟机使用的指令仅仅占一个字节,因而称为字节码。基于寄存器的指令因为须要指定源地址和目标地址。因此须要占用很多其它的指令空间,比如,Dalvik虚拟机的某些指令须要占用两个字节。基于堆栈和基于寄存器的指令集各有优劣。一般而言,运行相同的功能,前者须要很多其它的指令(主要是load和store指令),而后者须要很多其它的指令空间。

须要很多其它指令意味着要多占用CPU时间,而须要很多其它指令空间意味着数据缓冲(d-cache)更易失效。


3、此外,另一种观点觉得。基于堆栈的指令更具可移植性,由于它不正确目标机器的寄存器进行不论什么如果。

然而,基于寄存器的指令由于对目标机器的寄存器进行了如果。因此。它更有利于进行AOT(ahead-of-time)优化。 所谓AOT,就是在解释语言程序执行之前。就先将它编译成本地机器语言程序。AOT本质上是一种静态编译,它是是相对于JIT而言的,也就是说。前者是在程序执行前进行编译。而后者是在程序执行时进行编译。执行时编译意味着能够利用执行时信息来得到比較静态编译更优化的代码,同一时候也意味不能进行某些高级优化。由于优化过程太耗时了。还有一方面,执行前编译由于不占用程序执行时间,因此。它就能够不计时间成本来优化代码。

不管AOT。还是JIT,终于的目标都是将解释语言编译为本地机器语言,而本地机器语言都是基于寄存器来执行的。因此,在某种程度来讲,基于寄存器的指令更有利于进行AOT编译以及优化。

4、无论结论怎样,Dalvik虚拟机都在尽最大的努力来优化自身,这些措施包含:

        (1). 将多个类文件收集到同一个dex文件里。以便节省空间;

        (2) 使用仅仅读的内存映射方式载入dex文件,以便能够多进程共享dex文件。节省程序载入时间。

        (3) 提前调整好字节序(byte order)和字对齐(word alignment)方式,使得它们更适合于本地机器。以便提高指令运行速度。

        (4) 尽量提前进行字节码验证(bytecode verification)。提高程序的载入速度。

        (5) 须要重写字节码的优化要提前进行。


5、内存管理

Dalvik虚拟机的内存大体上能够分为Java Object Heap、Bitmap Memory和Native Heap三种。

        Java Object Heap是用来分配Java对象的。也就是我们在代码new出来的对象都是位于Java Object Heap上的。Dalvik虚拟机在启动的时候,能够通过-Xms和-Xmx选项来指定Java Object Heap的最小值和最大值。

为了避免Dalvik虚拟机在执行的过程中对Java Object Heap的大小进行调整而影响性能,我们能够通过-Xms和-Xmx选项来将它的最小值和最大值设置为相等。


这个Java Object Heap的最大值也就是我们平时所说的Android应用程序进程可以使用的最大内存。这里必需要注意的是。Android应用程序进程可以使用的最大内存指的是可以用来分配Java Object的堆。


在HoneyComb以及更高的版本号中,Bitmap Memory就直接是在Java Object Heap中分配了,这样就能够直接接受GC的管理

        Native Heap就是在Native Code中使用malloc等分配出来的内存。这部分内存是不受Java Object Heap的限制大小的,也就是它能够自由使用。当然它是会受到系统的限制。可是有一点须要注意的是。不要由于Native Heap能够自由使用就滥用,由于滥用Native Heap会导致系统可用内存急剧降低,从而引发系统採取激进的措施来Kill掉某些进程,用来补充可用内存。这样会影响系统体验。


6、垃圾收集

Dalvik虚拟机能够自己主动回收那些不再使用了的Java Object,也就是那些不再被引用了的Java Object。垃圾自己主动收集机制将开发人员从内存问题中解放出来。极大地提高了开发效率,以及提高了程序的可维护性。


 在GingerBread以及更高的版本号中,Dalvik虚拟使用的垃圾收集机制得到了改进,例如以下所看到的:

        (1) Cocurrent,也就是大多数情况下,垃圾收集线程与其他线程是并发运行的;

        (2)Partial collection,也就是一次可能仅仅收集一部分垃圾;

        (3)一次垃圾收集造成的程序中止时间通常都小于5ms。



7、进程和线程管理

一般来说,虚拟机的进程和线程都是与目标机器本地操作系统的进程和线程一一相应的,这样做的优点是能够使本地操作系统来调度进程和线程。进程和线程调度是操作系统的核心模块,它的实现是很复杂的,特别是考虑到多核的情况,因此,就全然没有必要在虚拟机中提供一个进程和线程库。



 Dalvik虚拟机执行在Linux操作系统之上。

我们知道,Linux操作系统并没有纯粹的线程概念,仅仅要两个进程共享同一个地址空间,那么就能够觉得它们同一个进程的两个线程。Linux操作系统提供了两个fork和clone两个调用。当中,前者就是用来创建进程的,而后者就是用来创建线程的。



 关于Android应用程序进程,它有两个非常大的特点。以下我们就简要介绍一下。


第一个特点是每个Android应用程序进程都有一个Dalvik虚拟机实例。这样做的优点是Android应用程序进程之间不会相互影响,也就是说,一个Android应用程序进程的意外中止。不会影响到其他的Android应用程序进程的正常执行。


第二个特点是每个Android应用程序进程都是由一种称为Zygote的进程fork出来的。Zygote进程是由init进程启动起来的,也就是在系统启动的时候启动的。Zygote进程在启动的时候。会创建一个虚拟机实例,并且在这个虚拟机实例将全部的Java核心库都载入起来。每当Zygote进程须要创建一个Android应用程序进程的时候。它就通过复制自身来实现,也就是通过fork系统调用来实现。

这些被fork出来的Android应用程序进程,一方面是复制了Zygote进程中的虚拟机实例,还有一方面是与Zygote进程共享了同一套Java核心库。这样不仅Android应用程序进程的创建过程非常快,并且因为全部的Android应用程序进程都共享同一套Java核心库而节省了内存空间。



摘至:http://blog.csdn.net/luoshengyang/article/details/8852432

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

des vue 加密解密_vue DES 加密

ECB模式import cryptoJs from crypto-js// DES加密export const encryptDes (message, key) > {var keyHex cryptoJs.enc.Utf8.parse(key)var option { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }var encrypted cryptoJs.DES.encrypt(message, keyHex, op…

使用jQuery清空表单

$(#theform)[0].reset(); reset()这个函数的作用是将表单的值重置&#xff0c;变为默认值&#xff0c; 例&#xff1a; <input type"text" value"姓名"> 这个标签的默认值就是”姓名“&#xff0c;如果使用上面的方法&#xff0c;就会重置为“姓名”…

MobX快速入门教程(重要概念讲解)

转载请注明原文地址&#xff1a;http://www.cnblogs.com/ygj0930/p/7372119.html 一&#xff1a;Mobx工作流程图 二&#xff1a;MobX涉及到的概念 1:状态state 组件中的数据。 2:被观察observable 被observable修饰的state数据将会暴露给整个app&#xff0c;各观察者组件都可以…

CentOS工作内容(七)禁用IPV6

CentOS工作内容&#xff08;七&#xff09;禁用IPV6 用到的快捷键 tab 自动补齐(有不知道的吗) ctrla 移动到当前行的开头(a ahead) ctrle 移动到当前行的开头(e end) ctrlu 删除(剪切)此处至开始所有内容 复制进来&#xff1a;按一下鼠标右键粘贴到SercureCRT 复制出去&#x…

循环结束后变回去 设置一个值_VBA掌握循环结构,包你效率提高500倍

这是系列免费教程《Excel VBA&#xff1a;办公自动化》&#xff0c;还是老规矩&#xff0c;看看我们走到哪里了。1.认识VBA&#xff1a;什么是VBA&#xff1f;2.这些掌握了&#xff0c;你才敢说自己懂VBA3.VBA变量5年踩坑吐血精华总结4.VBA中重要的强制申明&#xff0c;谁看谁明…

连接到kali linux服务器上的MySQL服务器错误

前言&#xff1a;想把数据库什么的都放在虚拟机kali Linux里&#xff0c;但无奈出了好多错误。 首先&#xff1a;可以参照上一篇文章开启kali服务器端的远程连接功能&#xff0c;上一篇文章 然后&#xff1a;使用window端的sqlyog&#xff08;MySQL图形化连接工具&#xff09;连…

dedecms后台怎么添加发布软件?织梦后台软件内容管理

使用织梦cms有很多的功能&#xff0c;其中有一个是在dedecms后台添加发布软件&#xff0c;然后在前台大家可以直接下载软件&#xff0c;在织梦cms后台怎么添加发布软件呢&#xff1f;下面是织梦软件内容管理的主要操作步骤。使用织梦cms有很多的功能&#xff0c;其中有一个是在…

301 302区别_如何正确理解301,302和canonial标签

今天我们来学习一下几个比较容易混淆的页面跳转标签&#xff0c;301&#xff0c;302&#xff0c;relcanonial。在谷歌SEO里面&#xff0c;我们比较容易常见的是第一个301&#xff0c;302和canonial出现的比较少&#xff0c;但是不代表不存在&#xff0c;我会尝试从以下价格方面…

ffmpeg文档08-表达式计算/求值

8 表达式计算/求值 在计算表达式时&#xff0c;ffmpeg通过libavutil/eval.h接口调用内部计算器进行计算。 表达式可以包含一元运算符、运算符、常数和函数 两个表达式expr1和expr2可以组合起来成为"expr1;expr2" &#xff0c;两个表达式都会被计算&#xff0c;但是新…

为什么手机游戏手柄没有流行起来?

问答社区知乎上有人提了一个问题&#xff0c;“为什么手机用游戏手柄没有流行&#xff1f;” Ta找了不少论证&#xff1a;1&#xff09;手机用户数量很大&#xff1b;2&#xff09;大量用户在手机上花费最多时间的是玩游戏&#xff1b;3&#xff09;游戏机平台&#xff08;的游…

c++排序算法ppt_C/C++学习教程:C语言排序算法—插入排序算法

前言&#xff1a;插入排序算法是所有排序方法中最简单的一种算法&#xff0c;其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中&#xff0c;最终得到的序列就是已经排序好的数据。直接插入排序是插入排序算法中的一种&#xff0c;采用的方法是&#xff1a;在…

python函数参数

1.位置参数 2.默认参数 指向参数为不可变对象 3.可变参数 **args 一个列表list或是元组tuple 4.关键字参数 **kw,是一个字典dict 5.命名关键字参数 *, 转载于:https://www.cnblogs.com/aliy-pan/p/5198025.html

Python 常用函数 configparser模块

使用ConfigParser模块读写ini文件 ConfigParserPython的ConfigParser Module中定义了3个类对INI文件进行操作。分别是RawConfigParser、ConfigParser、SafeConfigParser。模块所解析的ini配置文件是由多个section构成&#xff0c;每个section名用中括号‘[]’包含&#xff0c;每…

自制Unity小游戏TankHero-2D(3)开始玩起来

自制Unity小游戏TankHero-2D(3)开始玩起来 我在做这样一个坦克游戏&#xff0c;是仿照&#xff08;http://game.kid.qq.com/a/20140221/028931.htm&#xff09;这个游戏制作的。仅为学习Unity之用。图片大部分是自己画的&#xff0c;少数是从网上搜来的。您可以到我的github页…

mysql按月分列统计_实现mysql按月统计的教程

mysql有个字段是DATETIME类型&#xff0c;要实现可以按月统计&#xff0c;该怎么写sql语句&#xff1f;select month(f1) from tt group by month(f1)or select DATE_FORMAT(f1,%m) from tt group by DATE_FORMAT(f1,%m)比如数据库的为2008-01-15 12&#xff1a;10&#xff1a;…

Log4j的扩展-支持设置最大日志数量的DailyRollingFileAppender

Log4j现在已经被大家熟知了&#xff0c;所有细节都可以在网上查到&#xff0c;Log4j支持Appender&#xff0c;其中DailyRollingFileAppender是被经常用到的Appender之一。在讨论今天的主题之前&#xff0c;我们先看下另外一个Appender。 最常用的Appender——RollingFileAppend…

VirtualBox虚拟机安装CentOS 7

新建虚拟机 因为比较简单&#xff0c;所以对于VirtualBox就不做过多介绍了&#xff0c;直接下载安装即可&#xff0c;安装好之后打开Oracle VM VirtualBox管理器&#xff0c;点击新建&#xff0c;选择Red Hat&#xff08;根据windows主机选择 32/64 bit&#xff0c;通常会自动识…

mysql 指定账户已存在_安装mysql时告诉我指定的账户已存在?

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

C语言:用字符读取流和输出流来读写入数据。(文本文件)

/* 文件的几种操作模式: r:只读 w:只写 rw:可读可写 文件的分类&#xff1a; t:文本文件(字符文件) b:二进制文件(字节文件)注意&#xff1a; 采用只读方式打开文件时,如果源文件不存在,打开文件会失败&#xff01; 采用只写方式打开文件时,不管源文件存不存在,都不会失败…

PC 上访问设备数据库的方法

通过 .NET 访问 .sdf 的数据库的方法&#xff1a; 在 VS2005 IDE 中&#xff0c;创建 SQL MOible 数据库&#xff0c;编辑表结果和填充数据。 具体是在 Server Explorer 中&#xff0c;右键单击 “Data Connections”&#xff0c;选择 “Add Connection”&#xff0c;新建一个 …