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省去了运行时解释执行,效率更高,速度更快。
相关文章
|
22天前
|
Oracle 安全 Java
深入理解Java生态:JDK与JVM的区分与协作
Java作为一种广泛使用的编程语言,其生态中有两个核心组件:JDK(Java Development Kit)和JVM(Java Virtual Machine)。本文将深入探讨这两个组件的区别、联系以及它们在Java开发和运行中的作用。
48 1
|
2月前
|
Java
jvm复习,深入理解java虚拟机一:运行时数据区域
这篇文章深入探讨了Java虚拟机的运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、元空间和运行时常量池,并讨论了它们的作用、特点以及与垃圾回收的关系。
69 19
jvm复习,深入理解java虚拟机一:运行时数据区域
|
2月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
39 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
58 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
3月前
|
存储 Java 编译器
🔍深入Android底层,揭秘JVM与ART的奥秘,性能优化新视角!🔬
【9月更文挑战第12天】在Android开发领域,深入了解其底层机制对提升应用性能至关重要。本文详述了从早期Dalvik虚拟机到现今Android Runtime(ART)的演变过程,揭示了ART通过预编译技术实现更快启动速度和更高执行效率的奥秘。文中还介绍了ART的编译器与运行时环境,并提出了减少DEX文件数量、优化代码结构及合理管理内存等多种性能优化策略。通过掌握这些知识,开发者可以从全新的角度提升应用性能。
79 11
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
166 1
|
4月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
85 1
|
4月前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
55 3
|
4月前
|
Android开发
Cannot create android app from an archive...containing both DEX and Java-bytecode content
Cannot create android app from an archive...containing both DEX and Java-bytecode content
44 2
|
4月前
|
Java 编译器 测试技术
Java零基础教学(03):如何正确区别JDK、JRE和JVM??
【8月更文挑战第3天】Java零基础教学篇,手把手实践教学!
71 2
下一篇
DataWorks