安卓虚拟机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)编译的特性。这种混合编译的方式旨在提高应用程序的性能和启动速度,同时减少内存占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GO泛型相关

通过引入 类型形参 和 类型实参 这两个概念,我们让一个函数获得了处理多种不同类型数据的能力,这种编程方式被称为 泛型编程。 2. Go的泛型 类型形参 (Type parameter)类型实参(Type argument)类型形参列表( Type parameter list)类型约束(Type constr…

50 vmalloc 的实现

前言 这里说的是 内核中分配按页分配的场景 常用于 驱动什么的, 分配 中大型空间 由于 连续的 n 个页是分别使用 alloc_pages 分配的, 因此是 虚拟地址空间连续, 但是 物理地址空间不连续 如何分配对象 两个步骤, __get_vm_area_node 获取为 size 分配的 vma 区间, 然后…

Spark(1)-wordCount入门

1. 创建Maven项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习&#xff0c;上部分就是对于java的基础知识&#xff0c;面向对象上&#xff0c;面向对象下&#xff0c;异常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…

用冒泡排序模拟C语言中的内置快排函数qsort!

目录 ​编辑 1.回调函数的介绍 2. 回调函数实现转移表 3. 冒泡排序的实现 4. qsort的介绍和使用 5. qsort的模拟实现 6. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免…

逻辑回归与决策边界解析

目录 前言1 逻辑回归基础1.1 Sigmoid函数&#xff1a;打开分类之门1.2 决策函数&#xff1a;划定分类界限1.3 逻辑回归详解 2 决策边界2.1 线性决策边界2.2 非线性决策边界2.3 决策边界的优化 3 应用与实例3.1 垃圾邮件分类&#xff1a;精准过滤3.2 金融欺诈检测&#xff1a;保…

关于调试出现的问题(console.log)

偶然之间发现了一个关于控制台打印的问题&#xff0c;感觉大家偶尔可能会遇到这种问题&#xff0c;这种问题的出现并不是代码的错误哦 首先我们先看代码&#xff1a; let arr [{ a: 1 },{ b: 1 } ] console.log(arr) arr[0].a console.log(arr) 可能大家预想的打印结果如下&…

C++——模版

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;这是2024年的第一篇博文&#xff0c;我们将继续C的学习&#xff0c;今天这篇文章&#xff0c;我们来习一下——模版。 目录 一.什么是模版 二.模版分类 1.函数模版 2.类模板 总结 一.什么是模版 说起模版&#xff0c;我们…

MATLAB图像噪声添加与滤波

在 MATLAB 中添加图像噪声和进行滤波通常使用以下函数&#xff1a; 添加噪声&#xff1a;可以使用imnoise函数向图像添加各种类型的噪声&#xff0c;如高斯噪声、椒盐噪声等。 滤波&#xff1a;可以使用各种滤波器对图像进行滤波处理&#xff0c;例如中值滤波、高斯滤波等。 …

Linux笔记-1

概述 简介 Linux是现在服务器上最常用的操作系统(OS - Operating system) - 所谓的操作系统本质上也是一个软件&#xff0c;是一个可以运行其他软件的容器如果一台服务器&#xff0c;没有安装操作系统&#xff0c;此时称之为裸机。裸机可以使用&#xff0c;在使用的时候需要使…

如何恢复edge的自动翻译功能

介绍&#xff1a;对于英文不好的小伙伴&#xff0c;把英语翻译成中文是有帮助的&#xff0c;而edge可以直接对英文页面翻译这一功能更是受人喜爱&#xff0c;但是&#xff0c;最近发现这一项功能消失了。 原始界面&#xff1a; 下面展示如何恢复该功能。 1.打开edge&#xff…

提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…

AI大模型分析:数据背后隐藏的故事!

在当今的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型已经成为挖掘和解读庞大数据集背后故事的强大工具。这些模型通过分析复杂的数据模式&#xff0c;不仅揭示了数据的表面信息&#xff0c;还深入挖掘出潜藏的含义和联系&#xff0c;为我们提供了前所未有的…

初识C语言—常见关键字

变量的命名最好有意义 名字必须是字母&#xff0c;数字&#xff0c;下划线组成&#xff0c;不能有特殊字符&#xff0c;同时不能以数字开头 变量名不能是关键字 typedef---类型定义&#xff0c;类型重命名 #include <stdio.h>typedef unsigned int uint; //将unsigne…

VBA数据库解决方案第九讲:打开数据库记录集,所得数据回填

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

详解 Rope (Opal-03a) 的变化

文章目录 &#xff08;一&#xff09;特点&#xff08;二&#xff09;使用流程&#xff08;三&#xff09;界面&#xff08;四&#xff09;详解&#xff08;4.1&#xff09;目录区域⭐Start Rope⭐Video Folder⭐Output Folder⭐Faces Folder &#xff08;4.2&#xff09;预览控…

幻兽帕鲁专用服务器搭建之Linux部署配置教程

大家好我是飞飞&#xff0c;上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求&#xff0c;很多小伙伴就寻思用Linux系统搭建占用会不会小一点&#xff1f;有计算机基础的小伙伴都知道Linux系统和Windows系统相比&#xff0c;…

带你玩转java封装和继承(上)

上次带大家学习了java里面比较重要的知识点类和对象&#xff0c;而且我们知道java是一门面向对象的语言&#xff0c;有时一个程序里可能有很多类&#xff0c;那么这么多类他们之间有什么联系吗&#xff1f;今天就带大家学习一下java类之间的关系。 什么是继承&#xff1a; 我们…

【数据结构】实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解栈&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一 .栈的概念及结构二 .栈的实现栈的结构体初始化销毁栈顶插入栈顶删除显示栈顶元素是否为空栈的大…

2673. 使二叉树所有路径值相等的最小代价

给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&#xff0c;用下标从 0 开始、长度为 n 的整…