当前位置: 首页 > news >正文

安卓虚拟机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 MachineDalvik Virtual Machine
Instruction SetJava 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创造价值,让人类享受收益

我梦想有天,每个有能力的人都可以做自己喜欢的事情,都应该去做自己喜欢的事情,并且可以获得应有的收益。 有的人可以称之为“人”,有的人你得称他为鬼,有的人不如畜生。 如今社会,每个人都为了“生活”日…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

OpenLayers 可视化之热力图

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

7.4.分块查找

一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...