Android 虚拟机

2023-09-20 16:14:20

Android 虚拟机

Java虚拟机

基于栈的虚拟机

每一个运行时的线程,都有一个独立的栈。

栈中记录了方法调用的历史,每一次方法调用,栈中都会产生一个栈帧。最顶部的栈帧称为当前栈帧,代表当前执行的方法。

基于栈道虚拟机通过操作数栈进行所有操作。

在这里插入图片描述

栈的执行流程

Java代码:

public void foo() {
    int a = 1;
    int b = 2;
    int c = (a + b)*9;
}

编译为字节码:

在这里插入图片描述

执行过程:

第一步:执行第0行指令,将1压入操作数栈。

第二步:执行第1行指令,将栈顶的值1存入局部变量表。

第三步:执行第2行指令,将2压入操作数栈。

第四步:执行第3行指令,将2存入局部变量表。

第五步:执行第4行指令、第5行指令,将1和2压入操作数栈。

第六步:执行第6行指令,进行相加并压入操作数栈。

第七步:将int类型值9压入操作数栈。

第八步:执行第9行指令,进行相乘并压入操作数栈。

第九步:将栈顶值存入局部变量表。

Dalvik虚拟机

Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应一个单独的Dalvik虚拟机实例。

Dalvik虚拟机本质也是一个Java虚拟机,只不过它执行的不是class文件而是dex文件。

在这里插入图片描述

基于寄存器的虚拟机

基于寄存器的虚拟机没有操作数栈,但是有很多虚拟寄存器。

与JVM相似,在Dalvik虚拟机中每个线程都有自己的寄存器和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。

寄存器的执行流程

dex字节码:

在这里插入图片描述

执行过程:

第一步:执行第0行指令,将1放入寄存器v0。

第二步:执行第1行指令,将2放入寄存器v1。

第三步:执行第2行指令,相加后将结果放入寄存器v0。

第四步:执行第3行指令,将v0和9相乘,并将结果放入v0。

Java虚拟机与Dalvik虚拟机区别

Java虚拟机Dalvik虚拟机
指令集Java字节码
(基于栈)
Dalvik字节码
(基于寄存器)
文件格式.class 文件.dex 文件
单条指令长度很长
同样逻辑指令条数
同样逻辑数据移动次数
同样逻辑临时结果存储次数

所以为什么Android平台基于寄存器的设计?

  1. 指令条数少,所以执行的效率更快!
  2. 数据移动次数少、临时结果存放次数少,所以更省内存和执行效率更快!
  3. 映射真实机器的寄存器,所以执行效率更快!

ART虚拟机

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字节码的文件。

Dalvik下应用在安装的过程,会执行一次优化,将dex字节码进行优化生成odex文件。而Art下将应用的dex字节码翻译成本地机器码的最恰当AOT时机也就发生在应用安装的时候。

在Android 7.0中ART 引入了预先编译机制(Ahead Of Time),在安装时,ART 使用设备自带的 dex2oat 工具来编译应用,dex中的字节码将被编译成本地机器码。

Android 7.0的运行方式

ART 使用预先 (AOT) 编译,并且从 Android N混合使用AOT编译,解释和JIT。

1、最初安装应用时不进行任何 AOT 编译(安装又快了),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。

2、当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。

更多推荐

mybatis学习记录(二)-----CRUD--增删改查

目录使用MyBatis完成CRUDz--增删改查3.1insert(Create)3.2delete(Delete)3.3update(Update)3.4select(Retrieve)查询一条数据查询多条数据使用MyBatis完成CRUDz--增删改查准备工作创建module(Maven的普通Java模块):myb

算法通关村-----动态规划高频问题

最少硬币数问题问题描述给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。详见leetcode322问题分析设f(n)为amount=n时使用的最少金币数。遍

【JavaSE笔记】数组

一、前言数组被广泛应用于各种应用场景中。在这篇文章中,我们将深入探讨Java数组的概念、定义、基本操作、多维数组以及常见的应用场景。二、数组的基本概念1、什么是数组数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。比如现实中的车库:在java中,包含6个整形类型元素的数组,就相当于上图中连在一起的6个车

【腾讯云 Cloud Studio 实战训练营】基于Python实现的快速抽奖系统

文章目录⭐️CloudStudio-简介🌟操作步骤🌟注册CloudStudio🌟创建工作空间🌟启动对应的开发环境⭐️抽奖系统项目介绍⭐️抽奖系统代码结构图⭐️项目基础类-文件检查🌟base.py基础类文件检查示例如下:🌟common模块的error.py脚本的代码如下:🌟utils.py模块check_f

CRM软件系统趣味性——游戏化销售管理

对于企业销售来说,高薪酬也伴随着更高的压力与挑战。高强度的单一工作会让销售人员逐渐失去对工作的兴趣,导致售状态缺少动力和激情,工作开展愈加困难。您可以通过CRM系统进行游戏化销售管理,让销售人员重新干劲满满。游戏并不是纯粹的娱乐,它其实还是提升个人竞争意识、团队协作的一种方式,因此,将它一味的妖魔化是不可取的。也正因如

Linux 中nc指令的使用总结

nc指令概述用法一:端口扫描用法二:命令行中发送和接收数据用法三:建立双方通信nc指令概述nc是Linux系统中的netcat命令之简称,它是一个强大的网络工具,可以用于创建TCP/UDP套接字连接。常见的其用法模板可定位:nc[选项][地址][端口],它的用法如下图所示:知道你英语差了一丢丢,小鸽鸽给你准备了中文版:

【C++】string类模拟实现下篇(附完整源码)

目录1.resize2.流插入<<和流提取>>重载2.1流插入<<重载2.2流提取<<3.常见关系运算符重载4.赋值重载4.1浅拷贝的默认赋值重载4.2深拷贝赋值重载实现4.3赋值重载现代写法5.写时拷贝(了解)6.源码6.1string.h6.2test.cpp1.resize下面我们来实现一下resize():re

【C++ 程序设计】实战:C++ 实践练习题(21~30)

目录21.计算并输出1到9之间奇数之和22.多层嵌套计算23.循环结构:打印变量a、b、c24.函数调用:全局变量、局部变量25.找到数组中不等于最大值和最小值的元素26.计算:平方根、平方、立方根、立方27.找出三个整型数中的最大值28.初始化一个5x5的二维数组a,根据表达式(i+1)*(j+1)将数组元素设置为i

【UML】软件工程中常用图:类图、部署图、时序图、状态图

作者简介:前言:UML中的很多东西平时都听过、用过,诸如类图、时序图等,本文将详细详细讲一下UML中常用的几类图,并且会引入一个完整的例子来讲解,UML在工程上到底该怎么合理使用。目录1.概述1.1.什么是UML?1.2.UML用在何处?2.静态结构2.1.类图2.2.部署图3.描述动态3.1.顺序图3.2.状态图4.

【UML】详解UML类图

目录1.概述2.权限3.关系3.1.连线关系3.2.依赖3.3.泛化(继承)3.4.实现3.5.关联3.6.聚合3.7.组合1.概述UML是什么?书面化一点的说法是:UML(UnifiedModelingLanguage),统一建模语言,是一种用于软件工程和系统设计的标准图形化建模语言。它旨在帮助开发人员、设计师和分析

8年经验之谈 —— App测试常用的两种工具

一、监控工具DDMS的全称是DalvikDebugMonitorService,是Android开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、模拟接收及发送SMS、虚拟地理坐标等服务。启动DDMSEclipse中启动方法:1

热文推荐