JVM,Dalvik VM和ARTdocker与虚拟机的区别之间的区别

JVM/Dalvik和ART的区别 - CSDN博客
JVM/Dalvik和ART的区别
书籍:《深入剖析Tomcat》 《Java性能权威指南》
& JVM 和Dalvik虚拟机的区别
&虚拟机的多线程是通过线程切换并分配执行时间,同时一个内核在任一时刻只处理一条线程的指令&
&虚拟机栈和堆是线程共享的数据区,方法区、本地方法栈和程序计数器是线程所不能访问到的数据区
&其中数据访问的方式有两种:一种是句柄形式,引用指向句柄,句柄包含对象地址和对象类型;一种是指针,直接存储对象地址,以句柄少一步,所以访问也会快一些,而HotSpot就是用这种;前者也有一定优化,值发生改变时,引用不用变,后者要改变指针才行。
&内存异常有两种表现,一种叫OutOfMemoryError(内存溢出),请求的虚拟机扩展栈已无足够空间,分配给新对象,典型的标记-清理算法容易产品这种情况,另一种叫StackOverflowError(内存泄露),请求的栈深度超过虚拟机所允许 ,例如下标超过数据大小,一般线程不同步会引起这种状况的产生。
&算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。)。
Dalvik 虚拟机和 Sun JVM 在架构和执行方面有什么本质区别?- /question/
&JVM: .java -& javac -& .class -& jar -& .jar , 架构: 堆和栈的架构.
&DVM: .java -& javac -& .class -& dx.bat -& .dex , 架构: 寄存器(cpu上的一块高速缓存)。
& Dalvik与JVM的最大差别在于,前者基于寄存器架构(句柄引用),后者基于栈架构(指针引用),也就是说前者处理速度更快。另外后者采用JIT的编译方式即时编译-也叫热加载,适用于J2EE;而前者采用AOT的加载方式,提前编译,虽然加载时间变长,但运行过程流畅,适用于J2ME,而iOS也是同样的原理。
新生代:一般是指大批对象产生的快,消亡的也快;
老生代:一般是指大批对象产生后,不容易消。
&&& Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短。
& Dalvik和Java运行环境的区别
1:Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
2:Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
3:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex
4:dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。
5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。
6:所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制
7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要 & & & & 一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。
8:Dalvik是由Dan Bornstein编写的,名字来源于他的祖先曾经居住过名叫Dalvík的小渔村,村子位于冰岛Eyjafj&r&ur
& 许多GC实现都是在对象开头的地方留一小块空间给GC标记用。Dalvik VM则不同,在进行GC的时候会单独申请一块空间,以位图的形式来保存整个堆上的对象的标记,在GC结束后就释放该空间。&
& dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大用个比喻来说就是,骑自行车dalvik 是已经折叠起来的自行车,每次骑都要先组装自行车才能骑ART 是已经组装好的自行车,每次骑直接上车就能走人效率高在开启的时候,运行中的速度是差不多的。
& JVM,Java虚拟机
& 对VM而言,先掌握规范才是最最重要和核心的事情。Class文件是理解Vm实现的关键。
&Oracle的JVM SE7官方规范:
所有从Java层调用JNI的线程以及从Native线程往调用Java函数的线程都需要创建一个JNIEnv。说白了,JNIEnv环境是Java和Native世界的桥梁。
深入java虚拟机笔记之虚拟机即时编译详解- http://blog.csdn.net/u/article/details/
& 好多人觉得JDK源码太多,无从下手,经常半途而非,以我的经验来说,最好的方法是当你在项目中用到了某个类,可以利用空闲时间去研究,当然这是在感兴趣的前提下,比如简单 ArrayList 是如何实现的, StringBuilder 和 StringBuffer 有什么区别, HashMap 的实现原理,带着问题去分析,从简单的类开始循序渐进,同时在分析过程中能够用自己的语言整理出来.
Java虚拟机体系结构-
& 在Java虚拟机内部有两种线程:守护线程和非守护线程。守护线程通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。但是,Java程序也可以把它创建的任何线程标记为守护线程。而Java程序中的初始线程——就是开始于main()的那个,是非守护线程。&
& 只要还有任何非守护线程在运行,那么这个Java程序也在继续运行。当该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。假若安全管理器允许,程序本身也能够通过调用Runtime类或者System类的exit()方法来退出。
& Java虚拟机是通过某些数据类型来执行计算的,数据类型可以分为两种:基本类型和引用类型,基本类型的变量持有原始值,而引用类型的变量持有引用值。
& Java虚拟机的引用类型被统称为“引用(reference)”,有三种引用类型:类类型、接口类型、以及数组类型,它们的值都是对动态创建对象的引用。类类型的值是对类实例的引用;数组类型的值是对数组对象的引用,在Java虚拟机中,数组是个真正的对象;而接口类型的值,则是对实现了该接口的某个类实例的引用。还有一种特殊的引用值是null,它表示该引用变量没有引用任何对象。&
& 在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统。
& JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分。由不同的类装载器装载的类将被放在虚拟机内部的不同命名空间中。
& 常量池存储了相应类型所用到的所有类型、字段和方法的符号引用,所以它在Java程序的动态连接中起着核心的作用。
& 每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。&
& 本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。&
& Dalvik,Android虚拟机
虚拟机JIT的实现原理的简要介绍- http://blog.reverberate.org/2012/12/hello-jit-world-joy-of-simple-jits.html
Dalvik虚拟机- http://blog.csdn.net/jiazhijun/article/category/1363536
ART深度探索开篇:从Method Hook谈起- http://weishu.me//dive-into-art-hello-world/
& Dalvik虚拟机的功能可以分为以下几部分:
1、进程管理:每个虚拟机都有一个进程,依赖于Zygote机制实现
2、Zygote进程管理:会fork出来一个子Zygote进程,一个SystemServer进程,一个非Zygote进程的Speciallize进程
3、类加载:先加载所有类库,然后加载字节码,放入类数据结构,供类解释器执行,如果有关联的超类、接口等也一并加载
4、内存管理:使用新老生代结合的方式,使用复制+标记-清除的算法
4、本地接口:JNI
5、反射机制:通过类结构的加载,查看、调用、修改类中的方法和属性
6、解释器:负责执行Dex字节码
7、即时编译:JIT
Dalvik是以前的,ART是Android 4.4(好像是)的时候发布的,因为Dalvik是应用运行的时候进行编译,而ART是全部编译完了再运行,效率要高很多。
& Dalvik编译的原理在于:开发者编译项目成dex,在安装时转成odex,减少了JIT时再进行字节码校验等工作;
而ART在Android4.4版本出现,相比较Dalvik的优势在于,直接将dex编译成可执行的机器码,这样加速App的运行,减少电量的消耗,用户体验更加流畅;当然劣势也是有的,App安装时比较慢,缓存文件变大;较之iOS一次开发者编译,即在用户手机运行有先天的弊端,优势在于Android热修复和动态加载方便,而IOS相对则比较古板。
&为什么Android4.4采用ART取代Dalvik非常重要?--
&Dalvik和ART运行时环境的区别--
&Dalvik和ART的区别--
art和dalvik的区别?--
深入理解Dalvik字节码指令及Smali文件-
&深入理解Android(三):Xposed详解-- q.com/cn/articles/android-in-depth-xposed?utm_source=articles_about_android-in-depth&utm_medium=link&utm_campaign=android-in-depth
&深入理解Android(二):Java虚拟机Dalvik-- q.com/cn/articles/android-in-depth-dalvik?utm_source=articles_about_android-in-depth&utm_medium=link&utm_campaign=android-in-depth
&深入理解Android(一):Gradle详解-- q.com/cn/articles/android-in-depth-gradle?utm_source=articles_about_android-in-depth&utm_medium=link&utm_campaign=android-in-depth
&Android为我们从ClassLoader派生出了两个类:DexClassLoader和PathClassLoader。DexClassLoader和PathClassLoader的父类是ClassLoader.
因此DexClassLoader和PathClassLoader都属于符合双亲委派模型的类加载器(因为它们没有重载loadClass方法)。也就是说,它们在加载一个类之前,回去检查自己以及自己以上的类加载器是否已经加载了这个类。如果已经加载过了,就会直接将之返回,而不会重复加载。
DexClassLoader和PathClassLoader其实都是通过DexFile这个类来实现类加载的。这里需要顺便提一下的是,Dalvik虚拟机识别的是dex文件,而不是class文件。因此,我们供类加载的文件也只能是dex文件,或者包含有dex文件的.apk或.jar文件。
& PathClassLoader是通过构造函数new DexFile(path)来产生DexFile对象的;而DexClassLoader则是通过其静态方法loadDex(path, outpath, 0)得到DexFile对象。这两者的区别在于DexClassLoader需要提供一个可写的outpath路径,用来释放.apk包或者.jar包中的dex文件。换个说法来说,就是PathClassLoader不能主动从zip包中释放出dex,因此只支持直接操作dex格式文件,或者已经安装的apk(因为已经安装的apk在cache中存在缓存的dex文件)。而DexClassLoader可以支持.apk、.jar和.dex文件,并且会在指定的outpath路径释放出dex文件。
& dx --dex --output=dynamic_temp.jar dynamic.jar
这样就生成了dynamic_temp.jar,这个jar和dynamic.jar有什么区别呢?
其实这条命令主要做的工作是:首先将dynamic.jar编译成dynamic.dex文件(Android虚拟机认识的字节码文件),然后再将dynamic.dex文件压缩成dynamic_temp.jar,当然你也可以压缩成.zip格式的,或者直接编译成.apk文件
& 插件开发的过程中DexClassLoader和PathClassLoader这两个类加载器了是很重要的,但是他们也是有区别的,而且我们也知道PathClassLoader是Android应用中的默认加载器。他们的区别是:DexClassLoader可以加载任何路径的apk/dex/jar
PathClassLoader只能加载/data/app中的apk,也就是已经安装到手机中的apk。这个也是PathClassLoader作为默认的类加载器的原因,因为一般程序都是安装了,在打开,这时候PathClassLoader就去加载指定的apk(解压成dex,然后在优化成odex)就可以了。
&& ClassLoader双亲委派机制能很好地解决类加载的统一性问题。对一个 Class 对象来说,如果类加载器不同,即便是同一个字节码文件,生成的 Class 对象也是不等的。也就是说,类加载器相当于 Class 对象的一个命名空间。双亲委派机制则保证了基类都由相同的类加载器加载,这样就避免了同一个字节码文件被多次加载生成不同的 Class 对象的问题。但双亲委派机制仅仅是Java 规范所推荐的一种实现方式,它并不是强制性的要求。近年来,很多热部署的技术都已不遵循这一规则,如 OSGi 技术就采用了一种网状的结构,而非双亲委派机制。
& &Dalvik的类加载器:
import android.app.A &
import android.content.C &
import android.os.B &
import android.util.L &
import android.widget.ListV &
public class MainActivity extends Activity { &
& & @Override &
& & protected void onCreate(Bundle savedInstanceState) { &
& & & & super.onCreate(savedInstanceState); &
& & & & setContentView(R.layout.activity_main); &
& & & & &&
& & & & Log.i(&DEMO&, &Context的类加载加载器:&+Context.class.getClassLoader()); &
& & & & Log.i(&DEMO&, &ListView的类加载器:&+ListView.class.getClassLoader()); &
& & & & Log.i(&DEMO&, &应用程序默认加载器:&+getClassLoader()); &
& & & & Log.i(&DEMO&, &系统类加载器:&+ClassLoader.getSystemClassLoader()); &
& & & & Log.i(&DEMO&, &系统类加载器和Context的类加载器是否相等:&+(Context.class.getClassLoader()==ClassLoader.getSystemClassLoader())); &
& & & & Log.i(&DEMO&, &系统类加载器和应用程序默认加载器是否相等:&+(getClassLoader()==ClassLoader.getSystemClassLoader())); &
& & & & &&
& & & & Log.i(&DEMO&,&打印应用程序默认加载器的委派机制:&); &
& & & & ClassLoader classLoader = getClassLoader(); &
& & & & while(classLoader != null){ &
& & & & & & Log.i(&DEMO&, &类加载器:&+classLoader); &
& & & & & & classLoader = classLoader.getParent(); &
& & & & } &
& & & & &&
& & & & Log.i(&DEMO&,&打印系统加载器的委派机制:&); &
& & & & classLoader = ClassLoader.getSystemClassLoader(); &
& & & & while(classLoader != null){ &
& & & & & & Log.i(&DEMO&, &类加载器:&+classLoader); &
& & & & & & classLoader = classLoader.getParent(); &
& & & & } &
& & & & &&
---------------------------------
本文已收录于以下专栏:
相关文章推荐
本文转载自:点击打开链接
Dalvik是Google公司自己设计用于Android平台的虚拟机。Dalvik经过优化,使其更适合Android平台。具体优点会在下面和JVM进行比较时...
1. 什么是JVM?
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算...
android Dalvik
JVM、DVM(Dalvik VM)和ART虚拟机对比
http://blog.csdn.net/evan_man/article/details...
Android dalvik我们已经知道jvm,其实jvm和dalvik虚拟机共享差不多的特性,
例如,它们都是解释执行,并且支持即时编译(JIT)、垃圾收集(GC)、Java本地方法调用(JNI)...
1.Dalvik:
它是Google公司自己设计用于Android平台的Java虚拟机。dex格式是专为Dalvik应用设计的一种压缩格式,适合于内存和处理器速度有限的系统。Dalvik允许同时运行...
这是第一篇博客,从此踏入程序员的“不归路”-
什么是JVMJVM 是 Java 的核心和基础,在 Java 编译器和 os 平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实...
本文在于帮助大家快速的有一定深度的了解Android虚拟机。如果读者期望更加深入的了解相关的内容,可以根据文末给出的参考资料继续往下学习。如果觉得文中内容有什么错误,欢迎读者朋友指正,同时如需要转载请...
Android系统是以Linux系统为底层构建的,开源的Android系统需要配置到不同硬件配置的设备上,为了降低应用的开发难度,在Linux底层之上构筑了一个名为&Dalvik&的虚拟机,名为虚拟机...
虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M ,
谈谈加载图片的时候怎么处理大图片的,
outmemoryException
BitmapFactory.option 
ART和Dalvik区别Art上应用启动快,运行快,但是耗费更多存储空间,安装时间长,总的来说ART的功效就是”空间换时间”。ART: Ahead of Time Dalvik: Just in Ti...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Dalvik VM (DVM) 与Java VM (JVM)之间有哪些区别 - CSDN博客
Dalvik VM (DVM) 与Java VM (JVM)之间有哪些区别

Dalvik虚拟机是Google等厂商合作开发的移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik
Executable)格式的应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。(dx 是一套工具,可以将 Java .class 转换成
.dex 格式. 一个dex档通常会有多个.class。由于dex有时必须进行最佳化,会使档案大小增加1-4倍,以ODEX结尾。)   
&&&&&&&1、Dalvik 和标准 Java 虚拟机(JVM)的首要差别
&&&&&&&Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 JVM字节码中,局部变量会被放入局部变量表中,继而被压入堆栈供操作码进行运算,当然JVM也可以只使用堆栈而不显式地将局部变量存入变量表中。Dalvik字节码中,局部变量会被赋给65536个可用的寄存器中的任何一个,Dalvik指令直接操作这些寄存器,而不是访问堆栈中的元素。
&&&&&&&2、Dalvik 和 Java 字节码的区别
&&&&&& VM字节码由.class文件组成,每个文件一个class。JVM在运行的时候为每一个类装载字节码。相反的,Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类。Java编译器创建了JVM字节码之后,Dalvik的dx编译器删除.class文件,重新把它们编译成Dalvik字节码,然后把它们写进一个.dex文件中。这个过程包括翻译、重构、解释程序的基本元素(常量池、类定义、数据段)。常量池描述了所有的常量,包括引用、方法名、数值常量等。类定义包括了访问标志、类名等基本信息。数据段中包含各种被VM执行的函数代码以及类和函数的相关信息(例如DVM所需要的寄存器数量、局部变量表、操作数堆栈大小),还有实例变量。
&&&&&&&3、Dalvik 和 Java SDK的SDK不同。
&&&&&&&4、Dalvik 和 Java 运行环境的区别&   
&&&&&&&Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
&&&&&&&Dalvik虚拟机在android2.2之后使用JIT (Just-In-Time)技术,与传统JVM的JIT并不完全相同, 
&&&&&& Dalvik虚拟机有自己的 bytecode,并非使用 Java bytecode。
&&&&&&&还有以下几点:
&&&&&& 1、Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。   
&&&&&& 2、Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。   
&&&&&& 3、不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex。   
&&&&&& 4、dex文件格式可以减少整体文件尺寸,提高I/O操作的类查找速度。   
&&&&&& 5、odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。   
&&&&&& 6、所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。   
&&&&&& 7、有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化、库的加载、预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的速度提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。
本文已收录于以下专栏:
相关文章推荐
Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格...
原文地址:/android/environment/332.html
Dalvik虚拟机存在于Android系统,JVM是Java虚拟机,两者都是虚...
Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik
Executable)格式的Java应用程序的运行,.de...
编译后文件格式:
Dalvik vm (DVM):.java--&,class--&.jar      ----(jdk  javac)
java vm (JVM):.java --&.class--...
本文在于帮助大家快速的有一定深度的了解Android虚拟机。如果读者期望更加深入的了解相关的内容,可以根据文末给出的参考资料继续往下学习。如果觉得文中内容有什么错误,欢迎读者朋友指正,同时如需要转载请...
(1) Dalvik VM和JVM 的第一个区别是 Dalvik VM是基于寄存器的架构(reg based),而JVM是栈机(stack based)。reg based VM的好处是可以做到更好的...
这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的。第一次出现这样的的问题以后,引发了其他的问题。在网上一查可能是JAVA的堆栈...
This post is a cheatsheet with enumeration of options, which should be always used to configure Java...
这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的。第一次出现这样的的问题以后,引发了其他的问题。在网上一查可能是JAVA的堆栈...
报错如下:17/07/10 00:50:18 INFO receiver.BlockGenerator: Pushed block input-0-0
17/07/10 00:...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Dalvik和JVM,Art的几点区别
时间: 08:16:23
&&&& 阅读:110
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&Dalvik和JVM的几点区别
&&&&&1、Dalvik&基于寄存器,而&JVM&基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。
&&&&&2、Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
&&&&&3、Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
&&&&&4、不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex,ex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。
&&&&&5、所有的Android应用的线程都对应一个Linux进程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制,DVM指dalivk的虚拟机。每一个Android
&&&&&应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux&中的一个进程,所以说可以认为是同一个概念
Dalvik和ART的几点区别
dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小
ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大
用个比喻来说就是,骑自行车
dalvik&是已经折叠起来的自行车,每次骑都要先组装自行车才能骑
ART&是已经组装好的自行车,每次骑直接上车就能走人
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://my.oschina.net/ososchina/blog/374633
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!一、Dalvik介绍
Dalvik VM是Android平台的核心组成部分之一,它的名字来源于冰岛一个名为Dalvik的小渔村。Dalvik VM并不是一个Java虚拟机,它没有遵循Java虚拟机规范,不能直接执行Java的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。但是它与Java又有着千丝万缕的联系,它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等。
日,Android L 正式亮相于召开的谷歌I/O大会,Android L 改动幅度较大,谷歌将直接删除Dalvik,代替它的是传闻已久的ART。
二、ART介绍
在Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这一机制并不高效,但让应用安装比较快,而且更容易在不同硬件和架构上运行。
ART完全改变了这种做法,在应用安装时就预编译字节码到机器语言,在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。
三、Dalvik与JVM的区别
1、Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短。
2、Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex
四、Dalvik与ART的区别
1、ART与Dalvik最大的不同在于,在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。
2、ART占用空间比Dalvik大(字节码变为机器码之后,可能会增加10%-20%),这就是“时间换空间大法”。
3、预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20331次
排名:千里之外
原创:40篇
评论:24条
阅读:2695
(1)(9)(15)(5)(4)(4)(1)(1)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 容器和虚拟机的区别 的文章

 

随机推荐