【Android】Android虚拟机

news2024/11/17 13:45:18

虚拟机

Android的虚拟机主要有两种:Dalvik 虚拟机 ART(Android Runtime)虚拟机

Dalvik 虚拟机
Dalvik 虚拟机是 Android 早期使用的虚拟机,它基于寄存器架构。从Android 2.2版本开始,支持JIT即时编译(Just In Time)在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。Dalvik 执行的是经过转换优化后的 dex(Dalvik Executable)字节码文件,而不是传统的 Java 字节码。Dalvik 虚拟机针对移动设备的特点进行了优化,具有较小的内存占用和较高的执行效率。每个应用程序都在独立的 Dalvik 虚拟机实例中运行,实现了应用程序之间的隔离。

ART 虚拟机
自 Android 5.0(Lollipop)起,Android 引入了 ART 虚拟机作为默认的运行环境。ART 使用 Ahead-Of-Time(AOT)编译技术,将 dex 字节码在应用安装时预先编译成本地机器码,这样在运行时就无需再进行实时的字节码转换,提高了应用程序的启动速度和执行效率。与 Dalvik 不同,ART 的执行方式更接近于传统的 Java 虚拟机,采用基于堆栈的指令集

区别

基于寄存器的虚拟机

在基于寄存器的虚拟机中,将数据保存在寄存器中。虚拟寄存器可以看作是一个数组,用于存储局部变量、参数和临时变量等运行时数据。每个虚拟寄存器都有自己的编号,可以通过编号来访问和操作寄存器中的值。

在 Dalvik VM 中,每个线程都有自己的程序计数器(Program Counter,PC)和调用栈。程序计数器用于记录当前线程执行到的指令位置,而调用栈则用于保存方法调用的活动记录,每个活动记录称为一个帧(frame)。每个帧包含了方法的局部变量表和操作数寄存器等信息。

因此,对于基于寄存器的虚拟机来说,数据存放在寄存器中,虚拟寄存器是一个数组,保存在运行时栈中。每个线程都有自己的程序计数器和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。

基于栈的虚拟机

每个虚拟机运行时线程都有自己独立的栈。栈用来记录方法调用的历史,每当一个方法被调用时,就会在栈中创建一个新的栈帧(stack frame)。栈帧包含了方法的局部变量表、操作数栈以及一些额外的信息。

栈的顶部栈帧被称为当前栈帧,代表当前正在执行的方法。栈帧中的局部变量表用于存储方法中定义的局部变量和参数,而操作数栈用于执行方法中的操作。

基于栈的虚拟机通过操作数栈进行所有的指令操作。指令可以从操作数栈中取出操作数,执行相应的操作,然后将结果再次压入操作数栈中。这种基于栈的指令集设计简洁紧凑,并且不依赖于具体的硬件架构,因此能够实现较好的跨平台性。

方法执行完成或者遇到方法调用时,当前栈帧会被弹出,并且恢复到上一个栈帧,继续执行上一个方法。这样,通过不断创建和销毁栈帧,基于栈的虚拟机能够实现方法之间的无缝切换和控制流的管理。

总结起来,基于栈的虚拟机使用独立的栈来记录方法调用历史,每个栈帧代表一个方法的执行上下文,包含局部变量表和操作数栈。通过操作数栈进行指令操作,实现方法间的切换和控制流管理。这种设计具有简洁、紧凑和跨平台等特点。

Android程序安装优化

当一个应用在 Android 系统上被安装时,会根据所使用的运行时环境(Dalvik 或 ART)执行不同的优化过程。

Dalvik 虚拟机中,应用在安装过程中会进行一次优化,将应用的 dex 字节码转换为优化的可执行文件 odex(Optimized DEX)文件。这个优化过程由 dexopt 工具完成。dexopt 根据设备配置和系统策略,对 dex 文件进行字节码优化、预解析和预验证等操作,并生成 odex 文件。odex 文件包含了已经优化过的字节码以及相关的元数据信息,加速了应用运行时的加载和执行速度。

而在 ART(Android Runtime)中,引入了预先编译机制(Ahead Of Time Compilation)。在应用安装时,ART 使用设备自带的dex2oat工具将应用的 dex 字节码直接编译成本地机器码,也就是将应用的 dex 文件转换为 ELF(Executable and Linkable Format)可执行文件。这个编译过程可以发生在应用安装期间,也可以在应用首次运行时发生,具体取决于设备和系统策略。

通过将 dex 字节码编译为本地机器码,ART 提供了更高的应用执行性能和更低的内存占用。与 Dalvik 不同,ART 在应用运行时无需进行即时编译(Just-In-Time Compilation),而是直接执行本地机器码,提高了应用的响应速度和效率。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机系统 基础知识点汇总,超全!!!

计算基础知识点合集来啦!!! 更多知识请关注我!!! 近期内容: 第二章 数据结构与算法 知识点总结第三章 程序设计基础知识点整理第四章 软件工程基础知识点汇总第五章 数据库基础知识pyhon基础知…

JVM 调优设置

堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无…

Python web框架开发 - WSGI协议

目录 浏览器请求动态页面过程 多进程web服务端代码 - 面向过程 封装对象分析 增加识别动态资源请求的功能 为什么需要 WSGI协议 WSGI协议的介绍 定义WSGI接口 编写framwork支持WSGI协议,实现浏览器显示 hello world 本次开发的完整代码如下: 浏…

深度学习 / 数据处理:如何处理偏态数据

1 前言 当我们使用一个线性回归模型时,通常这个模型是在很大假设的前提下才有一个很好的结果: 1、假设预测因子和预测目标之间的关系是线性的2、数据不存在外在噪声:不存在一些极端的数据3、非共线性( collinearity)…

1分钟学会使用docker-compose部署 registry 以及可视化镜像

获取 docker-compose: curl -L https://github.com/docker/compose/releases/download/2.2.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose docekr-compose.yaml: version: 3.3services:registry-ui:image: joxit/docker-registry-ui:mainrestart: always…

appium如何连接多台设备

目录 前言: 1.我们拿两台设备来模拟操作下,使用:adb devices查看连接状况,获取到设备名称。 2.获取需要操作app的包名和页面名称(前提该设备已经打开了app) 3.设置初始配置信息 4.打开页面后操作元素&am…

嵌入式系统的不同方向及优化策略

当涉及到嵌入式系统开发时,可以根据具体的应用需求选择不同的方向进行优化。以下是一些常见的嵌入式系统方向及其特点: 单片机方向:这个方向主要针对使用单片机作为核心的嵌入式系统开发。单片机资源有限,适用于简单的控制任务&am…

基于Java的万年历(课设)

基于Java的万年历 资源链接:基于Java的万年历(课设) 文章目录 基于Java的万年历1 绪论2 需求分析3 概要设计3.1 类间组合框架3.2 布局结构示意3.3 对各个类的概述 4运行环境5 开发工具和编辑语言6 详细设计6.1 NiceCaelendar类6.2 NiceFram…

分享一个优秀的动态数据源开源库-dynamic-datasource-spring-boot-starter

分享一个优秀的动态数据源开源库-dynamic-datasource-spring-boot-starter 1.1 前言1.2 动态数据源开源库简介1.3 特性1.4 用法示例1.4.1 添加依赖1.4.2 配置数据源1.4.3 使用 DS 注解切换数据源 1.5 最佳实践 1.1 前言 在我们的Java后端研发工作中, 有时候由于业务的快速迭代…

Unity 热力图效果实现 笔记

Unity 热力图效果实现 笔记 参考文献连接: 1、人体热力图shader graph实现(URP) 超链接: https://www.youtube.com/watch?vKlMON4Dzq_0&t51s shader forge 翻译通用管线下 连接点实现方案: 2、碰撞热力图实现…

青岛大学_王卓老师【数据结构与算法】Week03_08_线性表的链式表示和实现8_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第…

Python打包工具 Pyinstaller使用教程(将.py以及Python解释器和相关库打包可执行文件)

文章目录 pyinstaller历史背景工作原理使用方法简介使用方法详解(请仔细阅读help文档中文翻译)help文档help文档中文翻译 简单使用示例1. 编译打包2. 拷贝到目标系统3. 运行(遇到问题) 如何使用xxx.spec文件重新编译配置项示例配置…

千字提炼商业智能BI精髓,言简意赅

商业智能BI的发展和数据的增长有很强的关联性,而当前人工智能、大数据、云计算、物联网、互联网等技术和应用都对数据的增长有促进作用,所以商业智能BI也就伴随着数据的增长,在各行各业的企业中开始发挥作用。 商业智能(Business…

uniapp 移动端 后台返回数据流 查看PDF

使用步骤&#xff1a; 1.官网下载地址pdf.js 2.在项目的根目录新建hybrid文件夹&#xff0c;将下载的pdf.js压缩包解压后&#xff0c;复制到hybrid下的html文件夹中 3.在page文件夹下新建一个filePreview.vue页面&#xff0c;页面代码如下&#xff1a; <template><…

C#核心知识回顾——5.结构体和类区别、抽象类和接口、核心知识图解

1.结构体和类区别 结构体和类最大的区别是在存储空间上的&#xff0c;因为结构体是值&#xff0c;类是引用&#xff0c;因此他们的存储位置一个在栈上&#xff0c;一个在堆上。 结构体和类在使用上很类似&#xff0c;结构体甚至可以用面向对象的思想来形容一类对象。 结…

SQL题型:根据逗号拆分列

例1&#xff1a; 表&#xff1a; 要实现的结果&#xff1a; 代码&#xff1a; select a.id as hyId,substring_index(substring_index(a.ch_ry_mc, ,,b.help_topic_id 1 ),,, - 1) AS CH_RY_ID FROM rsgl_hygl_hyxx a JOIN mysql.help_topic b ON b.help_topic_id < ( l…

Acwing.835 Trie字符串统计 (trie数据结构)

题目 维护一个字符串集合&#xff0c;支持两种操作: 1."Ix"向集合中插入一个字符串x; 2."Qx”询问一个字符串在集合中出现了多少次。 共有N个操作&#xff0c;输入的字符串总长度不超过 1 0 5 10^5 105&#xff0c;字符串仅包含小写英文字母。 输入格式 第一…

ChatGPT 和爬虫有什么区别?

ChatGPT是一种基于人工智能的对话模型&#xff0c;它通过训练大量的文本数据来生成自然语言回复。它可以用于实现智能对话系统&#xff0c;能够理解用户的输入并生成相应的回复。ChatGPT的目标是模拟人类对话&#xff0c;使得对话更加流畅和自然。 而爬虫是一种用于自动化地从…

linux 操作系统内核态用户态

1. 32位系统一个进程最多有多少堆内存 对 32 位操作系统而言&#xff0c;它的寻址空间是4G&#xff08;2的32次方&#xff09;&#xff0c;Linux把它分为两部分&#xff1a;最高的1G(虚拟地址从0xC0000000到0xffffffff)用做内核本身&#xff0c;成为“内核空间”&#xff0c;而…

ESP32-C2(8684) AT固件程序

ESP32C2 AT固件使用 ESP32 C2模组&#xff0c;如图1-1所示 图1-1 ESP32 C2模组 ESP32 C2开发板&#xff0c;如图1-2所示 图1-2 ESP32 C2开发 方案亮点 1、完整的 WiFi 子系统&#xff0c;符合 IEEE 802.11b/g/n 协议&#xff0c;具有 Station 模式、SoftAP 模式、SoftAP Stat…