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核心库而节省了内存空间。
时间: 2024-11-05 12:30:09

Dalvik虚拟机和JVM的对比的相关文章

Android Dalvik虚拟机和ART虚拟机对比

1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.Dalvik vs ARTDalvik Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件,但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex

Android内存优化(一)Dalvik虚拟机和ART虚拟机对比

1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀. 2.Dalvik vs ARTDalvik  Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件,但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.de

Dalvik虚拟机片面总结

1.Dalvik 基于寄存器,而 JVM 基于栈.2.Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例3.不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex,ex文件格式可以减少整体文件尺寸4.所有的Android应用的线程都对应一个Linux线程5.Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行.

《深入理解Java虚拟机:JVM高级属性与最佳实践》读书笔记(更新中)

第一章:走进Java 概述 Java技术体系 Java发展史 Java虚拟机发展史 1996年 JDK1.0,出现Sun Classic VM HotSpot VM, 它是 Sun JDK 和 OpenJDK 中所带的虚拟机,最初并不是Sun开发 Sun Mobile- Embedded VM/ Meta- Circular VM BEA JRockit/ IBM J9 VM JRockit曾号称世界上最快的java虚拟机,BEA公司发布.J9属于IBM主要扶持的虚拟机 Azul VM/ BEA

Android ART运行时与Dalvik虚拟机

这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验. 实验内容很简单:把felix包里的felix.jar包和一些bundles的jar包用android sdk里的dx及aapt工具转化为包含dex字节码的jar 包.这样使这些jar包能在Android上跑起来.(因为Android上使用的是在Dalvik虚拟机而不是标准的java虚拟机,所以“原生”的 jar包不能直接在Android上跑

安卓移动逆向(三)-Android Dalvik虚拟机

大家都知道Java程序是运行在Java虚拟机上,Android程序呢? 虽然Android平台使用Java语言来开发应用程序,但是Android程序却不是运行在标准的Java虚拟机上的. Google为Android平台专门设计了一套虚拟机来运行Android程序–Dalvik Virtual Machine,也就是Dalvik虚拟机了 本篇作用: 扫盲Dalvik虚拟机 了解Smail的语法,能读懂Smail文件 Dalvik概述 Dalvik的特点(相对于JVM) 体积小,占用内存小; 专有

Dalvik虚拟机动态加载DEX/JAR

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 在文章Dalvik虚拟机加载类的机制中,我们讨论了Dalvik虚拟机加载类的相关原理,本文就来讨论一下,如何利用Dalvik提供的这些机制进行DEX/JAR的动态加载. 首先要说明的是虽然Dalvik虚拟机可以进行动态加载,却无法像Java虚拟机那样方便动态加载JAR,也不支持

Android Dalvik虚拟机概述

Dalvik虚拟机概述 Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一.它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进

Dalvik VM和JVM的浅析

http://zh.wikipedia.org/wiki/Android http://zh.wikipedia.org/wiki/Dalvik虚拟机 http://zh.wikipedia.org/wiki/Java虚拟机 一.Dalvik VM和JVM的理解 JVM是一个虚构出来的运行Java程序的运行时,是通过在实际的计算机上仿真模拟各种计算机功能的实现.它具有完善的硬件架构(如处理器,堆栈,寄存器等),还具有相应的指令系统,使用JVM就是使Java程序支持与操作系统无关.理论上在任何操作