Android---DVM以及ART对JVM进行优化

Dalvik 

Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机,Android 工程师编写的 Java 或者 Kotlin 代码最终都是在这台虚拟机中被执行的。在 Android 5.0 之前叫作 DVM,5.0 之后改为 ART(Android Runtime)。在整个 Android 操作系统中,ART 位于图中红框位置。

虚拟机必须符合 Java 虚拟机规范,也就是要通过 JCM(Java Compliance Kit)的测试并获得授权。但是 DVM/ART 并没有得到授权。DVM 大多数实现与传统的 JVM 相同

\bullet Android 最初是被设计用于手机端,对内存空间要求较高;

\bullet 起初 Dalvik 目标是只运行在 ARM 架构的 CPU 上。 

针对这几种情况,Android DVM 有了自己独有的优化措施。

Dex 文件

传统 Class 文件是由一个 Java 源码文件生成的 .class 文件。Android 是把所有 Class 文件进行合并优化,然后生成一个最终的 class.dex 文件。dex 文件去除了 class 文件中的冗余信息(比如重复字符常量),并且结构更加紧凑。因此在 dex 解析阶段,可以减少 I/O 操作,提高了类的查找速度。

实例演示

1. 创建2个 java 类 Dex1.java 和 Dex2.java

public class Dex1 {private int num = 1;public int add(int i, int j) {return i + j;}
}
public class Dex4 {private int num = 1;private int count = 0;public int add(int i) {return i + num;}
}

 2. 通过 javac 命令将它们编译为 .class 文件

javac Dex1.java
javac Dex2.java

3. 通过以下命令将 Dex1.class 和 Dex2.class 打包到一个 jar 文件中

jar cvf AllDex.jar Dex1.class Dex2.class

4. 使用 dx 命令将 AllDex.jar 进行优化,并生成 AllDex.dex 文件

dx --dex --output allDex.dex AllDex.jar

注意: dx 命令需要配置环境变量中。

5. 通过 Android SDK 中的工具 dexdump 查看其字节码

dexdump -d -l plain AllDex.dex

结果如下

架构基于寄存器&基于堆栈结构

JVM 指令集是基于栈结构来执行的,Android 是基于寄存器的是在内存中模拟一组寄存器。Android 的字节码(smali)更多的是二地址指令和三地址指令。

DVM 字节码和 JVM 字节码的区别,如下代码示例:

public int add(int i, int j){return i +j;
}

1. 编译为 Dex1.class 文件后,add 方法的字节码如下,通过4行指令完成

2. 通过 dx 命令将 Dex1.class 优化为 .dex 文件后,再次查看它的 Dalvik 字节码。

add-int 指令需要3个寄存器参数:v0、v1、v2,这个指令会将 v2 和 v3 进行相加运算,然后将结果保存在寄存器 v0 中。return 指令将结果返回。

Dalvik 通过2行指令完成。基于寄存器的指令比基于栈的指令少,但基于寄存器的指令更长。二者比较如下:

内存管理与回收

DVM 和 JVM 另一个显著的不同就是内存结构的区别,主要体现在对堆内存的管理。Dalvik 虚拟机中将堆内存划分为两部分:Active HeanpZygote Heap。如下图所示

 图中的 Card Table 和 两个 Heap Bitmap 主要用来记录垃圾收集过程中对象的引用情况。

为什么要分 Zygote 和 Active 两部分?

Android 系统中的第一个 Dalvik 虚拟机是由 Zygote 进程创建的,而应用程序进程是由 Zygote 进程 fork 出来的。Zygote 进程是在系统启动时创建的,它会完成虚拟机的初始化、库的加载、预置类库的加载和初始化等操作。

在系统需要一个新的虚拟机实例时,Zygote 通过复制自身最快速的提供一个进程。另外对于一些只读的系统库,所有的虚拟机实例都与 Zygote 共享一块内存区域,大大减少了内存开销。如下图所示

当启动一个应用时,Android 的操作系统需要为应用程序创建新的进程,而这一操作是通过一种写实拷贝技术直接复制 Zygote 进程而来。这就意味着在开始的时候,应用程序进程和 Zygote 进程共享了同一个用来分配内存的堆。然而,当 Zygote 进程或者应用程序进程对该堆进行写操作时,内存就会进行真正的拷贝操作,使得 Zygote 进程和应用程序进程分别拥有自己的一份拷贝。拷贝是一件费时费力的事情,因此为了尽量避免拷贝,Dalvik 虚拟机将自己的堆划分为了两部分

Zygote 进程在启动过程中创建 Dalvik 虚拟机时,只有一个堆。但是当 Zygote 进程在 fork 第一个应用程序进程之前,会将已经使用的那部分堆内存划分为一部分,把还没有使用的堆内存划分为另外一部分。前者就称为 Zygote 堆,后者就称为 Active 堆。无论是 Zygote 进程,还是应用程序进程,当它们需要分配对象的时候,都在 Active 堆上进行。这样就可以使得 Zygote 堆尽可能少的被执行写操作,可以减少执行写时拷贝的操作时间。

Dalvik 虚拟机堆

在 Dalvik 虚拟机中,堆实际上就是一块匿名共享内存。Dalvik 虚拟机并不是直接管理这块匿名共享内存,而是将它封装成一个 mspace,交给 C 库来管理。

为什么这么做呢?

因为内存碎片问题是一个通用问题,不只是 Dalvik 虚拟机、 Java 堆为对象分配内存时会遇到,在 C 库的 malloc 函数在分配内存时也会遇到。

Android 系统使用的 C 库 bionic,使用了 Doug Lea 写的 dlmalloc 内存分配器。调用函数 malloc 的时候,使用的是 dlmalloc 内存分配来分配内存。这是一个成熟的内存分配器,可以很好的解决内存碎片问题。因此,Dalvik 虚拟机就很机制的利用 C 库里面的dlmalloc 分配器来解决内存碎片问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPIO基本原理

名词解释 高低电平:GPIO引脚电平范围:0V~3.3V(部分引脚可容忍5V)数据0就是0V,代表低电平;数据1就是3.3V,代表高电平; STM32是32位的单片机,所以内部寄存器也都是32位的…

国产单片机PY32F002B,32位ARM架构Cortex -M0+内核,性价比高

PY32F002B是普冉推出的新一代入门级32位MCU,内核使用 ARM Cortex M0,主频最高支持到24M,24K FLASH 3K SRAM存储,并支持1.7V~5.5V宽工作电压,-40 ~ 85 C工作温度。拥有1 x 12 位ADC、I2C、SPI、USART、TIM、LPTIM、IWDT…

麻了,别再为难软件测试员了

前言 有不少技术友在测试群里讨论,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些测试工程师了。 这不,为了帮大家节约时…

C# OpenCvSharp 利用Lab空间把春天的场景改为秋天

效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class Form1 : Form{public Form1(){InitializeComponent();}st…

LabVIEW生产者消费者架构

LabVIEW生产者消费者架构 生产者/消费者模式可以轻松地同时处理多个进程,同时还能以不同速率迭代。 缓冲通信 当多个进程以不同速度运行时,就适合采用进程间缓冲通信。有了足够大的缓冲区后,生产者循环可以以快于消费者循环的速度运行&…

Ubuntu 18.04 LTS中cmake-gui编译opencv-3.4.16并供Qt Creator调用

一、安装opencv 1.下载opencv-3.4.16的源码并解压 2.在解压后的文件夹内新建文件夹build以及opencv_install 3.启动cmake-gui并设置 sudo cmake-gui(1)设置界面中source及build路径 (2)点击configure,选择第一个def…

实现实时美颜:主播直播美颜SDK的技术细节

在今天的数字时代,直播和实时互动成为了日常生活的一部分,而主播直播美颜SDK的出现为用户提供了更加精美的视觉体验。这项技术的背后有着复杂的技术细节,从图像处理到机器学习,本文将深入探讨主播直播美颜SDK的技术细节&#xff0…

微信小程序 —— 会议OA项目首页布局与Mock数据交互

14天阅读挑战赛如果世界上有奇迹,那一定是努力的另一个名字。 目录 一、小程序布局 1.1 Flex布局 1.2 Flex属性 二、OA会议首页搭建 2.1 首页底部菜单 2.2 创建后端结口 2.3 Mock模拟数据 2.4 首页轮播图搭建 2.5 首页内容搭建 一、小程序布局 1.1 Flex布…

【一文清晰】单元测试到底是什么?应该怎么做?

我是java程序员出身,后来因为工作原因转到到了测试开发岗位。测试开发工作很多年后,现在是一名自由职业者 1、什么是单元测试 2、该怎么做单元测试 一、什么是单元测试? 单元测试(unit testing),是指对软件…

论文阅读 Memory Enhanced Global-Local Aggregation for Video Object Detection

Memory Enhanced Global-Local Aggregation for Video Object Detection Abstract 人类如何识别视频中的物体?由于单一帧的质量低下,仅仅利用一帧图像内的信息可能很难让人们在这一帧中识别被遮挡的物体。我们认为人们识别视频中的物体有两个重要线索&…

vue3后台管理系统之layout组件的搭建

1.1静态布局 <template><div class"layout_container"><!-- 左侧导航 --><div class"layout_slider"></div><!-- 顶部导航 --><div class"layout_tabbar"></div><!-- 内容展示区 --><…

Kaggle - LLM Science Exam(三):Wikipedia RAG

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、 [EDA, Data gathering] LLM-SE ~ Wiki STEM | 1k DS2.1 Data overview2.2 Data gathering 三、如何高效收集数据3.1 概述3.2 与训练数据关联的维基百科类别…

8.Covector Transformation Rules

上一节已知&#xff0c;任意的协向量都可以写成对偶基向量的线性组合&#xff0c;以及如何通过计算基向量穿过的协向量线来获得协向量分量&#xff0c;且看到 协向量分量 以 与向量分量 相反的方式进行变换。 现要在数学上确认协向量变换规则是什么。 第一件事&#xff1a;…

升级包版本之后Reflections反射包在springboot jar环境下扫描不到class排查过程记录

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

多继承vs查看类结构

多继承里面的虚函数 类A有两个虚函数&#xff0c;类B重写了其中一个&#xff0c;类C重写了两个&#xff1b; 类C里面可以重写所有继承到的虚函数&#xff08;类A、类B里面的虚函数&#xff09; class A { public:virtual void init() { std::cout << "A init !&qu…

计算机操作系统-第十天

目录 1、操作系统的进程 进程的概念 进程的组成------PCB 进程的组成------程序段、数据段 旧知新学&#xff1a;《程序是如何运行的》 进程的特征 本节思维导图 1、操作系统的进程 进程的概念 当我们打开多个qq程序&#xff0c;我们会发现任务管理器的进程中有…

解决方案-LBS用户位置Redis-GEO附近人/店铺

附近人 windows安装附近人列表功能mysqlredis GEO CNNVD-201511-230 未授权访问python 多线程 redis大端模式与小端模式IP地址的不同表现形式1.字符串表现形式2. 整数表现形式3.大小端模式下的IP地址 0x01 进入python正题Python的socket库1.socket.socket(family,type)2.socket…

02.机器学习原理(复习)

目录 机器学习的本质机器学习的类型Regression/回归Classification/分类Structured Learning/结构化学习 ML的三板斧设定范围设定标准监督学习半监督学习其他 达成目标小结达成目标设定标准设定范围 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜…

10.18作业

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

【网络安全】防火墙技术

防火墙是网络安全防御的重要组成部分&#xff0c;它的主要任务是阻止或限制不安全的网络通信。在这篇文章中&#xff0c;我们将详细介绍防火墙的工作原理&#xff0c;类型以及如何配置和使用防火墙。我们将尽可能使用简单的语言和实例&#xff0c;以便于初学者理解。 如果你对…