安卓虚拟机ART和Dalvik
目录
- 一、JVM和Dalvik
- 1.1 基于栈的虚拟机
- 字节码指令
- 执行过程
- 1.2 基于寄存器的虚拟机
- 二、ART与Dalvik
- dex2aot
- Android N的运作方式
- 三、总结
一、JVM和Dalvik
Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。
Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。
Dalvik虚拟机与Java虚拟机共享有差不多的特性,差别在于两者执行的指令集是不一样的,前者的指令集是基本寄存器的,而后者的指令集是基于堆栈的。
| . | Java Virtual Machine | Dalvik Virtual Machine |
|---|---|---|
| Instruction Set | Java Bytecode(Stack Based) | Dalvik Bytecode(Register Based) |
| File Format | .class file(one file, one class) | .dex file(one file, many classes) |
那什么是基于栈的虚拟机, 什么又是基于寄存器的虚拟机?
1.1 基于栈的虚拟机
对于基于栈的虚拟机来说, 每一个运行时的线程, 都有一个独立的栈。 栈中记录了方法调用的历史, 每有一次方法调用, 栈中便会多一个栈桢。 最顶部的栈桢称作当前栈桢, 其代表着当前执行的方法。 基于栈的虚拟机通过操作数栈进行所有操作。

字节码指令

执行过程
test方法
地址 指令
0 ICONST_1
1 ISTORE 0
2 ICONST_2
3 ISTORE 1
4 ILOAD 0
5 ILOAD 1
6 IADD
7 ISTORE 2
8 RETURN
过程:

1.2 基于寄存器的虚拟机
基于寄存器的虚拟机中没有操作数栈, 但是有很多虚拟寄存器。 其实和操作数栈相同, 这些寄存器也存放在运行时栈中, 本质上就是一个数组。 与JVM相似, 在Dalvik VM中每个线程都有自己的PC和调用栈, 方法调用的活动记录以帧为单位保存在调用栈上。



与JVM版相比, 可以发现Dalvik版程序的指令数明显减少了, 数据移动次数也明显减少了。
二、ART与Dalvik
Dalvik虚拟机执行的是dex字节码, 解释执行。 从Android 2.2版本开始, 支持 JIT即时编译(just in time),在程序运行的过程中进行选择热点代码( 经常执行的代码) 进行编译或者优化。
而ART( Android Runtime) 是在 Android 4.4 中引入的一个开发者选项, 也是 Android 5.0 及更高版本的默认 Android 运行时。 ART虚拟机执行的是本地机器码。 Android的运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者将自己的应用直接编译成目标机器码, APK仍然是一个包含dex字节码的文件。
那么, ART虚拟机执行的本地机器码是从哪里来?
dex2aot
Dalvik下应用在安装的过程, 会执行一次优化, 将dex字节码进行优化生成odex文件。 而Art下将应用的dex字节码翻译成本地机器码的最恰当AOT时机也就发生在应用安装的时候。 ART 引入了预先编译机制(Ahead of time ), 在安装时, ART 使用设备自带的 dex2oat 工具来编译应用, dex中的字节码将被编译成本地机器码。
Android N的运作方式
ART 使用预先 (AOT) 编译, 并且从 Android N混合使用AOT编译, 解释和JIT。
1、 最初安装应用时不进行任何 AOT 编译( 安装又快了) , 运行过程中解释执行, 对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。
2、 当设备闲置和充电时, 编译守护进程会运行, 根据Profile文件对常用代码进行 AOT 编译。 待下次运行时直接使用。
三、总结
Android 虚拟机主要有两种:Dalvik 虚拟机和 ART(Android Runtime)虚拟机。这两种虚拟机在 Android 系统中扮演着不同的角色。
Dalvik 虚拟机:
Dalvik 虚拟机是 Android 系统早期使用的虚拟机,被设计用于在资源受限的移动设备上运行 Android 应用程序。
Dalvik 虚拟机使用基于寄存器的指令集,每个应用程序在运行时会被编译成 Dalvik 字节码,然后由 Dalvik 虚拟机解释执行。
Dalvik 虚拟机采用的是 JIT(Just-In-Time)编译方式,即在运行时将字节码实时编译为本地机器代码执行,以提高应用程序的性能。
ART 虚拟机:
ART 虚拟机是 Android 5.0(Lollipop)及以后版本引入的新一代运行时环境。
ART 虚拟机使用基于 Ahead-Of-Time(AOT)编译的方式,即在应用安装时将字节码预先编译为本地机器代码,然后存储在设备上,以减少运行时的编译开销。
ART 虚拟机在应用安装时会将字节码转换为本地机器代码,这使得应用程序在运行时更快,减少了启动时间和内存占用。
总的来说,ART 虚拟机相比于 Dalvik 虚拟机在性能上有一定的优势,尤其是在应用启动速度和运行时性能方面。因此,Android 系统逐渐向 ART 虚拟机转变,许多新的 Android 版本都默认采用 ART 虚拟机作为运行时环境。
在 Android Nougat(Android 7.0)及之后的版本中,ART(Android Runtime)虚拟机引入了一种混合编译的方式,同时结合了 Ahead-Of-Time(AOT)编译、解释和 Just-In-Time(JIT)编译的特性。这种混合编译的方式旨在提高应用程序的性能和启动速度,同时减少内存占用。
相关文章:
安卓虚拟机ART和Dalvik
目录 一、JVM和Dalvik1.1 基于栈的虚拟机字节码指令执行过程 1.2 基于寄存器的虚拟机 二、ART与Dalvikdex2aotAndroid N的运作方式 三、总结 一、JVM和Dalvik Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。 Dalvik…...
OPENWRT本地局域网模拟域名多IP
本地配置MINIO服务时,会遇到域名多IP的需求。当某一个节点失效时,可以通过域名访问平滑过渡到其它的节点继续服务。 【MINIO搭建过程略】 搭建完毕后,有4个节点,对应的docker搭建命令: docker run --nethost --rest…...
今日学习总结2024.3.2
最近的学习状态比较好,感觉非常享受知识进入脑子的过程,有点上头。 实验室一个星期唯一一天的假期周六,也就是今天,也完全不想放假出去玩啊,在实验室泡了一天。 很后悔之前胆小,没有提前投简历找实习&…...
Java虚拟机(JVM)从入门到实战【上】
Java虚拟机(JVM)从入门到实战【上】,涵盖类加载,双亲委派机制,垃圾回收器及算法等知识点,全系列6万字。 一、基础篇 P1 Java虚拟机导学课程 P2 初识JVM 什么是JVM Java Virtual Machine 是Java虚拟机。…...
SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)
目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…...
数据结构——lesson5栈和队列详解
hellohello~这里是土土数据结构学习笔记🥳🥳 💥个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 💥对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…...
使用rsync同步服务器和客户端的文件夹
使用rsync同步服务器和客户端的文件夹 实现目的实验准备实验操作步骤服务器操作关闭防火墙和SELINUX安装rsync修改服务器配置文件/etc/rsync.conf创建服务器备份文件的目录创建rsync系统运行的用户修改备份文件的所有者和所属组创建rsync.passwd启动rsync服务并进行验证 客户端…...
计算机网络|Socket
文章目录 Socket并发socket Socket Socket是一种工作在TCP/IP协议栈上的API。 端口用于区分不同应用,IP地址用于区分不同主机。 以下是某一个服务器的socket代码。 其中with是python中的一个语法糖,代表当代码块离开with时,自动对s进行销毁…...
Python 使用 MyHDL库 实现FPGA板卡仿真验证
要使用 Python 结合 MyHDL 库实现 FPGA 板卡的仿真验证,您可以利用 MyHDL 提供的硬件描述语言和仿真功能来进行 FPGA 设计的验证。下面我将为您介绍一个简单的示例,演示如何使用 MyHDL 库进行 FPGA 设计的仿真验证。 步骤概述 编写 MyHDL 硬件描述&…...
解决SpringBoot集成WebSocket打包失败问题
前言 这几天在一个SpringBoot项目中使用WebSocket来用作客服聊天以及上传文件功能,项目在写的时候,以及在idea中跑的时候都非常完美,结果一打成jar包是,报错.在网上查了报错原因,原来是自己导入的WebSocket的jar与SpringBoot内置tomcat中的WebSocket的jar冲突,需要在打包时把S…...
i-vista五星测试标准
智能行车板块以八类场景评测汽车的 单车道纵向控制能力、 单车道横向控制能力、 单车道纵横向组合控制能力及换道辅助能力, 8类场景包括目标车静止、目标车低速、目标车减速、前车切入(新增场景)、直道居中行驶、直道驶入弯道、盲区无车、盲…...
初识Maven
介绍: web后端开发技术ApacheMaven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。安装:http://maven.apache.org/ Apache软件基金会,成立于19…...
16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(递归、思维、dp)
C. Min Max Sort 很不错的一道题目,不过脑电波和出题人每对上, q w q 。 qwq。 qwq。 正难则反。 我们考虑最后一步是怎么操作的。 最后一步一定是对 1 1 1和 n n n进行操作 那么上一步呢? 上一步应该是对 2 2 2和 n − 1 n-1 n−1 以此类推…...
Mongodb安装配置
Mongodb安装配置 一、MongoDB简介二、Windows下MongoDB安装2.1.MongoDB下载2.2.安装MongoDB【解压版】2.2.1.解压2.2.2.创建和 bin 目录同级 data\db 目录来存储 MongoDB 产生的数据2.2.3.进入 bin 目录,cmd命令行窗口,使用命令的指定存储数据文件的形式…...
Linux常用操作命令大全
Linux常用操作命令大全 Linux,作为一款开源的操作系统,深受全世界开发者和系统管理员的喜爱。在Linux环境下,用户通过命令行界面可以执行各种操作,从而实现对系统的全面控制。本文将详细介绍Linux中常用的操作命令,帮助读者更好地理解和运用这些命令。 一、文件操作命令…...
CVPR2023 | 提升图像去噪网络的泛化性,港科大上海AILab提出 MaskedDenoising,已开源!
作者 | 顾津锦 首发 | AIWalker 链接 | https://mp.weixin.qq.com/s/o4D4mNM3jL6sYuhUC6VgoQ 当前深度去噪网络存在泛化能力差的情况,例如,当训练集噪声类型和测试集噪声类型不一致时,模型的性能会大打折扣。作者认为其原因在于网络倾向于过度…...
[python] dict类型变量写在文件中
在Python中,如果你想要将一个字典变量以具有可读性的格式写入文件,并且指定缩进为2个空格,你可以使用json模块来实现。json模块提供了一种很方便的方法来进行序列化和反序列化Python对象。下面是一个具体的示例: 字典变量以具有可…...
设计循环队列
文章目录 一、循环队列的构建二、判断是否为空三、判断队列是否满了四、队列插入五、队列的删除六、队列取头尾 设计循环队列 下面是队列提供的接口函数 typedef struct {int* a;int k;int front;int rear; } MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {…...
linux文件解压和压缩命令
linux文件解压和压缩命令 1.格式.zip 解压:unzip filename.zip 压缩:zip filename.zip directoryName 2.格式.rar 解压: #解压方式1(会在当前解压目录内产生一个以压缩包名字命名的目录,目录内是解压内容) …...
飞链云:让AI创造价值,让人类享受收益
我梦想有天,每个有能力的人都可以做自己喜欢的事情,都应该去做自己喜欢的事情,并且可以获得应有的收益。 有的人可以称之为“人”,有的人你得称他为鬼,有的人不如畜生。 如今社会,每个人都为了“生活”日…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
