首页 > 编程知识 正文

Android Virtual Machine,android版本

时间:2023-05-05 15:02:54 阅读:170373 作者:4959

概要

Android4.4以上开始使用ART虚拟机,这是我们之前使用的Dalvik虚拟机,为什么谷歌突然换成了在Android上工作的虚拟机呢? 答案只有一个。 ART虚拟机更好。

1. Dalvik虚拟机基本知识简介

Dalvik的基本概念

Dalvik虚拟机是安卓程序的虚拟机,其指令集基于寄存器架构,运行自己的文件格式——dex字节码,主要负责对象的生命周期管理、堆栈管理、线程管理

android使用的Java代码与Java虚拟机相似,是android中Java程序的执行基础。

但是,dalvik虚拟机和Java虚拟机有很大的区别。

1 )、dalvik基于寄存器,而JVM基于堆栈

2 )、Dalvik执行特定的DEX文件格式,JVM执行*.class文件格式。

优点:

1 )事先优化代码,而不是在编译时等到运行时

2 )旨在高效运行多个虚拟机实例,其中虚拟机较小,使用空间也较小。

3 )为了简化解释器,常量池已更改为只使用32位索引

2、Dalvik流程管理:

dalvik流程管理依赖于linux的流程体系结构。 例如,如果要为APP应用程序创建进程,请使用Linux fork机制复制进程。 在许多情况下,复制过程比创建过程更有效率。

Zygote是虚拟机进程,也是虚拟机实例的孵化器,由init进程启动。 首先,system_server(android大多数系统服务的守护进程将孵化。 socket等待请求命令,并在APP应用程序启动时发出请求,zygote fork新的APP应用程序进程。 每次系统请求执行Android APP应用程序时,zygote都会使用lllogote

由于不同的APP应用程序在不同的进程空间中运行,因此当一个虚拟机关闭或意外中止时,可以最大限度地保护APP应用程序的安全和独立执行,而不会影响其他虚拟机。

随着使用时间的延长,安卓系统越来越慢。 很多中高端的安卓手机在硬件配置上即使比同期的iPhone高出很多,但长期使用后也会反应迟钝。 关于Android系统运行缓慢的原因众说纷纭,其中最广为人知的因素之一是Android中使用的Dalvik虚拟机的性能问题。

为此,谷歌于2014年推出了新的虚拟机ART,试图通过Android4.4系统为用户提供试用,从根本上改善系统的卡顿问题。 然后从Android5.0中废弃了Dalvik,全面推进了ART。

随着越来越多的安卓5.0及以上机型问世,很多终端用户已经使用了带有ART虚拟机的安卓系统。 系统是否真的变快了,还需要经过用户的考验。 首先,我们来看看ART有哪些技术改进。

众所周知,Android系统是以Linux为内核构建的。 谷歌为了降低APP应用的开发难度,适合不同硬件结构的设备,在Linux内核上构建了虚拟机。 安卓APP应用程序使用java开发,在虚拟机上运行。

Dalvik是Android4.4之前使用的虚拟机,它使用联合时间(JIT )技术进行代码转换,每次执行APP融合时将程序代码编译成机器语言并执行。 随着硬件水平的发展和对更高性能的需求,Dalvik虚拟机的不足越来越突出。 所产生的安卓运行时(art )虚拟机处理机制的根本区别在于采用了安卓主频(AOT )技术,并在APP应用安装过程中转换为机器语言,运行时不再解释,APP机箱在内存管理方面,ART也得到了相对较大的改进,对内存分配和回收进行了算法优化,减少了内存碎片,也缩短了回收时间。

下图是Google发布的使用不同性能测试工具时Dalvik和ART的得分对比:

ART工作原理1) 内存管理内存管理优化是ART的一大改进。

ART虚拟机首先从系统空间中获取足够的空间。 这些空间在未使用时不占用物理内存,仅在使用时分配物理内存,不需要时立即返还给系统。 ART根据需要将分配的空间托管在不同的算法上进行管理,主要提供以下内容

如下几种分配算法来进行内存分配,它们的定义可以在ART源码定义中看到:

enum AllocatorType {

kAllocatorTypeBumpPointer,  // Use BumpPointer allocator, has entrypoints.

kAllocatorTypeTLAB,  // Use TLAB allocator, has entrypoints.

kAllocatorTypeRosAlloc,  // Use RosAlloc allocator, has entrypoints.

kAllocatorTypeDlMalloc,  // Use dlmalloc allocator, has entrypoints.

kAllocatorTypeNonMoving,  // Special allocator for non moving objects, doesn't have entrypoints.

kAllocatorTypeLOS,  // Large object space, also doesn't have entrypoints.

};

其中后二种是没有跳转表(entrypoints)的,我们主要了解一下前面4种的分配策略:

RosAlloc(Rows of slots Allocator)的分配策略:在Ros Alloc Space分配对象,是一种线性分配方式,将一个大的连续空间划分为多个片,每个片中只能分配固定大小的内存。这种分配方式有一个更加细粒度的结构,可以锁定独立的对象。

BumpPointer:在Bump Pointer Space中分配对象。每一次申请时,分配需要的size,返回end地址的值。然后将end后移sized,作为下一次申请的地址。这种分配采用不计数申请的方式,直到发生out of memory。采用Moving GC的方式进行回收。

TLAB(Thread Local Allocation Block):在由Bump Pointer Space提供的线程局部分配缓冲区中分配对象,按线程进行管理。每一个线程,从Bump Pointer Space中申请一个block,在线程内使用Bump Pointer的分配策略。由于每一个线程独立在自己的block中分配内存,避免了同步,可以提高效率。

DLMalloc:这是原Dalvik使用的算法 。在Dl Malloc Space分配对象,将memory划分成很多小的数据块,每一个块的前8个或者16个字节作为Header,使用链表来管理空闲的数据块。

使用这些不同算法来分配内存,与Dalvik相比可以有效的减少碎片化,由于碎片化减少,相应也就减少了GC的次数。除此之外,像TLAB这样的算法引入,也减少了申请内存时线程之间的竞争。

在内存回收方面,ART也提供了几种GC算法,GC算法与内存分配算法相对应,关系如下表:






ART在回收memory时,会依据进程状态选择不同的算法。除此之外,ART在GC时采用了读写锁的机制,减少了进程被挂起的时间,因此较之于Dalvik,GC时线程挂起的时间也相应缩短。



2) 代码执行

我们引用一张Google的图来看一下Android对apk的执行流程(图片从上往下阅读)



Java文件在编译成class文件,然后经过Android平台的dx工具转换为Dex文件后,同Native code(JNI)和资源一起打包成apk,apk安装到手机后解压出Dex文件。Dalvik会通过dexopt工具将Dex优化,成为Odex文件,Odex文件的效率比Dex高,但其中大部分代码仍然需要每次执行时编译;而ART则会将Dex通过dex2oat工具编译得到一个ELF文件,它是一个可执行的文件。 关于Java代码的执行过程,以一段简单的代码为例:

int a = 1;

int b = 2;

public int test() {

① int x = a;

② int y = b;

int z = a + b;

return z;

}

在执行这段Java代码时,Dalvik虚拟机先要把test()方法的每句代码转译成Dex代码,对其中的① ② 两句赋值语句,执行时需要在虚拟机中进行“指令读取—识别指令—跳转—实例操作”的解析过程;而ART中Java代码都被以方法为单位编译成汇编指令,执行上面这个方法的时候,① ② 两句代码只需要直接拷贝两个寄存器的值,各需要一条汇编指令就可以完成,省去了跳转、指令读取的过程,执行效率也就大大提高了。

总结

虚拟机从Dalvik换成ART后,Android系统的性能得到了一定程度的提升。不过ART与Dalvik相比也存在一些缺点,比较明显的表现就是,apk经过dex2oat预编译之后,占用的空间增加,因此Android ROM占用的空间更大。手机在安装下载的apk时,安装时间也明显变长。但在手机硬件配置越来越高的今天,与获得更佳的系统性能相比,这个缺点也就不那么引人注目了。




版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。