Dalvik虚拟机和JVM的对比
Dalvik虚拟机与Java虚拟机有着很多相似的特性,都支持GC,JIT,JNI等等。其主要区别在于文件格式以及指令集不同,下面对两者的特性进行比较与讨论。
Difference1:文件格式
Dalvik的虚拟机类文件采用dex格式,而JVM的类文件是class格式。不同之处在于,我们熟悉的class字节码文件中只包含一个类,而dex文件中可以包含多个类。其好处在于多个类中重复的常数和字符串只会保存一份,一定程度上节省了空间,更适于在手机上运行。
Difference2:指令集
Dalvik的指令集基于寄存器,而JVM的指令集基于堆栈。不同之处在于,基于寄存器的指令在寄存器中寻址,速度更快但指令长度长;基于堆栈的指令集更短,但占用CPU时间较多。其对比类似于CISC与RISC的对比。从移植性而言,显然基于堆栈的指令集可移植性更好,它不针对目标机器的寄存器做任何优化。而基于寄存机的指令集可以再程序运行之前针对目标机器的寄存器对程序进行优化,这种优化是在编译过程中的优化,并非类似于JIT在运行过程中的动态优化,但最终目标都是将程序转化成本地机器语言。
下面,针对Dalvik虚拟机的内存管理,JIT,垃圾收集、JIT、JNI以及进程和线程管理进行讨论。
内存管理
Dalvik虚拟机的内存大体上可以分为三个部分:Java Object Heap、Bitmap Memory和Native Heap。
Java Object Heap用来存放Java对象,不同手机厂商对其大小有不同的设置,可以通过ActivityManager的getMemoryClass获取其最大值,该值是Android应用所能使用的最大内存。
Bitmap Memory用于存放和处理图片。在Android3.0之前,Bitmap Memory是Native Heap的一部分,其大小计入Java Object Heap,即bitmap和其他java对象所占用的内存不能超过上面JOH的最大值。在Android3.0之后,Bitmap Memory直接在JOH中分配,便于GC。
Native Heap是本地机器语言申请分配的内存。
垃圾回收
在Android2.3之前的版本中,Dalvik虚拟机的垃圾回收策略如下:
- 垃圾收集线程在执行的时候,其它的线程都停止,从而一次收集完全部的垃圾,这样导致的结果就是一次垃圾收集造成的程序中止时间通常都大于100ms。
- 在Android2.3之后,垃圾收集线程与其它线程是并发执行,一次可能只收集一部分垃圾,使得一次垃圾收集造成的程序中止时间大大降低,通常都小于5ms。
JIT
JIT是在程序运行的过程中进行编译,将反复调用的代码转化为本地机器码保存起来,这个过程是在运行时动态执行的,相对于程序编译时的优化而言,JIT会占用程序运行时间。Android2.2之后才开始支持JNI。
本地调用
Java程序运行在虚拟机上,需要将程序翻译成目标机器的指令来执行,有些功能需要调用目标机器操作系统接口来完成。Java的本地调用可以帮助我们在Java代码和C\C++代码中互相调用函数。Android提供了NDK来帮助我们实现JNI。
线程管理
Android的进程主要有两个特点:
- 每一个Android APP进程都有一个Dalvik虚拟机实例,这保证了多个app在运行时互不影响。
- 每一个Android应用程序进程都是由一种Zygote的进程fork出来的。而Zygote进程是由初始化进程创造出来的。Zygote进程在启动的时候,会创建一个虚拟机实例,并且在这个虚拟机实例将所有的Java核心库都加载起来。每当Zygote进程需要创建一个Android应用程序进程的时候,它就通过复制自身来实现,也就是通过fork系统调用来实现。这些被fork出来的Android应用程序进程,一方面是复制了Zygote进程中的虚拟机实例,另一方面是与Zygote进程共享了同一套Java核心库。这样不仅Android应用程序进程的创建过程很快,而且由于所有的Android应用程序进程都共享同一套Java核心库而节省了内存空间。
Dalvik虚拟机和JVM的对比的更多相关文章
- JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比
1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是, ...
- Dalvik 虚拟机和 Sun JVM 在架构和执行方面有什么本质区别?
目前我理解的是: 两者共同点: 都是解释执行 byte code 都是每个 OS 进程运行一个 VM,并执行一个单独的程序 在较新版本中(Froyo / Sun JDK 1.5)都实现了相当程度的 J ...
- Android内存优化(一)Dalvik虚拟机和ART虚拟机对比
1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.D ...
- Android Dalvik虚拟机
虽然Android平台使用Java来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的. 可能是出于效率和版权的考虑,Google为Android专门设计了一套虚拟机Dalvik V ...
- 深入理解JAVA虚拟机原理之Dalvik虚拟机(三)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用 ...
- Android ART运行时与Dalvik虚拟机
这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验. 实验内容很简单:把felix包里的feli ...
- 转 Android Dalvik虚拟机初识
首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的? 首先,我得承认第一个问题 ...
- Android Dalvik虚拟机初识(转)
原文地址:http://blog.csdn.net/andyxm/article/details/6126907 android虚拟机jvmjava优化linux内核 首先,让我们来思考下面几个问题: ...
- Android(java)学习笔记156:Java虚拟机和Dalvik虚拟机的区别
Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...
随机推荐
- 【Bootstrap】如何让响应式图片(img-responsive)水平居中
我们在用bootstrap排版内容的时候,有的时候在内容中需要图片水平居中对齐. 一般情况下,我们的图片都使用了 .img-responsive 类来实现响应式图片.如果需要实现响应式图片水平居中,那 ...
- layui 下拉框取值
layui.use('form', function () { var form = layui.form; form.on('select(Status)', function (data) { c ...
- java 循环document 通用替换某个字符串或特殊字符
document 生成xml时 报错 XML-20100: (Fatal Error) Expected ';'. 查了半天发现是 特殊字符 & 不能直接转出,需要进行转换,因为是通用方法很 ...
- grep命令总结
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹 ...
- pyqt5 做的小程序,可以用来UI做个小demo
#!/usr/bin/python3# -*- coding: utf-8 -*- """ZetCode PyQt5 tutorial This program crea ...
- eas之kdtable格式化
设置表.列.行或单元的格式化字符串 // 设置表table.getStyleAttributes().setNumberFormat(formatString); // 设置列column.getSt ...
- RF学习使用记录【4】
四 Extending Robot Framework 4.1 Creating test libraries RF的测试能力由测试库支持决定,已经有许多的测试库,有一些随着RF框架安装,但是更多的需 ...
- mapbox 支持国家2000 坐标系的数据
最近有个项目使用mapbox作为地图展示,但是mapbox 只支持web 墨卡托(3857)坐标系的数据.而客户想接入其他单位发布的共享数据,共享数据都是基于arcgisserver 发布的国家200 ...
- WERTYU(WERTYU, UVa10082)
把手放在键盘上时,稍不注意就会往右错一 位.这样,输入Q会变成输入W,输入J会变成输 入K等.键盘如图所示. 输入一个错位后敲出的字符串(所有字母均大写),输出打字员本来想打出的句子.输入保 证合法, ...
- 洛谷P1579 哥德巴赫猜想(升级版)【水题+素数】
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为 ...