Android DVM和Java JVM以及ART概述

简介: Android DVM(Dalvik Virtual Machine)和Java JVM(Java Virtual Machine)以及ART(Android RunTime)概述JVM,Java Virtual Machine,Java虚拟机,JVM是基于栈的虚拟机,JVM栈是内存中连续的存储空间。
Android DVM(Dalvik Virtual Machine)和Java JVM(Java Virtual Machine)以及ART(Android RunTime)概述


JVM,Java Virtual Machine,Java虚拟机,JVM是基于栈的虚拟机,JVM栈是内存中连续的存储空间。JVM优点是相对简单,实现了Java的跨平台。Android使用Java编程设计语言,DVM(Dalvik Virtual Machine )作为其虚拟机,Android App运行在系统进程里,每个进程对应着一个Dalvik虚拟机实例。
一个Android应用启动后运行在一个单独的Dalvik VM中,每一个Dalvik VM运行在一个单独的Linux进程中。Dalvik VM可在有限内存空间中同时运行多个Dalvik虚拟机实例。因此每一个Android应用作为一个独立的Linux 进程执行,作为安全隔离,该独立进程可以防止在Dalvik虚拟机崩溃时导致所有Android程序都被影响。 
Dalvik虚拟机在Android 2.2之后使用JIT (Just-In-Time)技术,与传统JVM的JIT并不完全一致。每一个Android应用在系统底层都会对应一个独立的DVM实例,其代码在虚拟机的解释下执行。Android应用的线程对应一个Linux线程,Dalvik虚拟机因此可以使用Linux操作系统内核的线程调度和管理机制。
Android DVM执行的是.dex文件(Dalvik Executable,以ODEX结尾),dex是专为Dalvik VM设计的一种文件压缩格式。Dalvik虚拟机有自己的 ByteCode,并非使用Java ByteCode。Java JVM执行.class字节码文件。对比Java的.jar和Android的.dex产生过程:
Java:
.java  --  .class  -- .jar


Android:
.java  --  .class  -- .dex


可以简单认为dex是若干class等Android资源的“归整”。多个class文件合并成一个dex文件所带来的问题,是方法数量超过65535编译错误,解决方案是MultiDex。
DVM是基于寄存器的虚拟机,JVM是基于栈的虚拟机。基于寄存器的DVM编译和运行时存取速度比栈快,DVM适合移动设备。JVM基于栈结构,代码在编译和运行时虚拟机须频繁从栈读写数据,此过程需要额外多的指令与内存访问,显然DVM速度更快。
DVM在GC时单独申请一块内存空间,以位图Bitmap形式来保存堆上对象的标记,GC结束后就释放该空间。 DVM GC策略默认是标记擦除垃圾回收算法,即Mark和Sweep两个阶段。Mark阶段使用两个Bitmap来描述堆的对象,一个为Live Bitmap,另一个Mark Bitmap。Live Bitmap标记上一次GC时被引用的对象,也就是没有被回收的对象,Mark Bitmap用来标记当前GC有被引用的对象。


Android 4.4发布ART(Android RunTime)。Android L后,ART取代DVM。ART虚拟机直接执行本地机器码。DVM运行的dex字节码需要通过解释器执行。作为兼容性考虑,ART环境下,Android应用程序仍然可以是一个包含dex的apk文件。在ART中,apk运行前,先对apk中的dex字节码进行解释翻译,取得到对应的本地Android机器指令,然后就可以在ART中直接执行。ART在安装apk(Android App)时就把dex中字节码随即编译成本地机器码,之后每次启动App,执行的即是本地机器码(类似于Windows下的exe文件)。ART省去了运行时解释执行,效率更高,速度更快。
相关文章
|
14天前
|
Oracle Java 关系型数据库
java体系结构和jvm
java体系结构和jvm
|
20天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
27天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】 在移动开发领域,性能优化一直是开发者关注的重点。随着Kotlin的兴起,许多Android开发者开始从传统的Java转向Kotlin进行应用开发。本文将深入探讨Kotlin与Java在Android平台上的性能表现,通过对比分析两者在编译效率、运行时性能和内存消耗等方面的差异。我们将基于实际案例研究,为开发者提供选择合适开发语言的数据支持,并分享一些提升应用性能的最佳实践。
|
25天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
67 0
|
18小时前
|
监控 Ubuntu Java
Java VisualVM远程监控JVM
Java VisualVM远程监控JVM
Java VisualVM远程监控JVM
|
6天前
|
缓存 监控 Java
深入理解Java虚拟机(JVM)性能调优
【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【2月更文挑战第28天】 在Android开发领域,Kotlin作为一种现代编程语言,逐渐取代了传统的Java语言。本文通过深入分析Kotlin和Java在Android平台上的性能差异,揭示两者在编译效率、运行速度以及内存消耗等方面的比较结果。我们将探讨Kotlin协程如何优化异步编程,以及Kotlin Extensions对提升开发效率的贡献。同时,文中还将介绍一些性能优化的实践技巧,帮助开发者在Kotlin环境下构建更加高效的Android应用。
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第27天】 在Android开发领域,Kotlin和Java一直是热门的编程语言选择。尽管两者都可以用于创建高质量的Android应用程序,但它们在性能方面的差异一直是开发者关注的焦点。本文通过深入分析Kotlin与Java在Android平台上的运行效率、编译时间及内存消耗等方面的表现,揭示两种语言在实际应用中的性能差异,帮助开发者根据项目需求做出更明智的选择。