注册
ART

聊聊ART虚拟机_对象的分配问题

前置知识



  • 有Android开发基础
  • 了解 Java 语法和 JVM

前言


ART 虚拟机(下图 Runtime 层),相信各位搞 Android 开发的同学都有知道,总体的印象呢就是:ART 与 JVM 不同,其不符合 JVM 规范不属于 JVM ,且为 Dalvik 的进阶版。


但是,我们有必要对 ART 进行更加深入的了解,其有助于我们对 Android 的更深层次的理解。所以,本文将和聊一聊 ART 虚拟机,以及 ART 中一个对象是如何分配的。



何为ART虚拟机


在开始阶段,我们还是需要来聊一下什么是 ART 虚拟机,其不同在何处。



探析Android中的四类性能优化一文中,我们有提到 ART 虚拟机是 Google 在 Android4.4 的时候引入的,其用于替代 Dalvik 虚拟机。而在替代 Dalvik 虚拟机的同时,他也是兼容之前的 dex 格式的。ART 与 Dalvik 的不同点如下所示。



ART特性

1. 预编译

Dalvik 中的应用每次运行时,字节码都需要通过即时编译器 JIT 转换为机器码,这会使得应用的运行效率降低。在 ART 中,系统在安装应用时会进行一次预编译(AOT,Ahead-Of-Time),将字节码预先编译成机器码并存储在本地,这样应用就不用在每次运行时执行编译了,运行效率也大大提高。


2. 垃圾回收算法

在 Dalvik 采用的垃圾回收算法是标记-清除算法,启动垃圾回收机制会造成两次暂停(一次在遍历阶段,另一次在标记阶段)。而在 ART 下,GC 速度比 Dalvik 要快,这是因为应用本身做了垃圾回收的一些工作,启动 GC 后,不再是两次暂停,而是一次暂停,而且 ART 使用了一种新技术(packard pre-cleaning),在暂停前做了许多事情,减轻了暂停时的工作量。


3. 64 位

Dalvik 是为 32 位 CPU 设计的,而 ART 支持 64 位并兼容 32 位 CPU,这也是 Dalvik 被淘汰的主要原因。



由此可知,ART 让 Android 的性能有了很大的提升,从 2015 直到现在,我们使用的都还是 ART 虚拟机。


下图为 ART 的整体架构,我们可以看出,上层是执行层,负责直接对书写的代码进行处理,而下层则为运行时刻对 Java 语法的支持。


ART架构


对象的分配


对于对象的分配问题,实际上是 ART 对于类的管理问题。而类中则是描述了一个对象的内存布局(类成员的大小、类型和排布)和其函数信息。


例如 Object 类,包含以下的信息:


一个保存的是类型定义,一个保存的是锁的信息。


Object 类


类加载


一个类分配的对象的大小,是由继承链所决定的。当 Java 中的类首次使用的时候,就会进行类加载。例如首次使用到一个子类的时候,会自动将继承链上面的所有父类都进行加载,而整个继承链上面的类的总和就是该子类的大小。


例如下文中的子类的大小就是 AWork + BaseWork 两者合起来的大小。


puvlic class AWork extends BaseWork{

public AWork(WorkBean workBean){
super(work);
}

@Override
public process(Processbean processbean){
workBean.getA().actionA(processbean.getProcessA);
}
}

内存布局


如下图所示,当有 A->B->Object 这个继承关系的时候,其内存布局是父类在上,子类在下的方式进行排布的。而在每一个类里面,则是将引用类型置于最上方,而其他的类型则按字母顺序进行排序。


内存布局


双亲继承(双亲委派)


何为双亲继承呢?


双亲委派的意思是如果一个类加载器需要加载类,那么首先它会把这个类请求委派给父类加载器去完成,每一层都是如此。一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。


这么做的好处有一点,那就是不会出现假的委派父类,我们在委派的时候按照既定的逻辑寻找、只有在继承链上面的才是正确的,使得不会有虚假的父类出现。


这类底层的逻辑,反映出合理的继承链是有利于设计和执行的。其实由此我们也可以看到,其实很多设计原则的道理和这些底层逻辑设计也是相同的,例如迪米特原则和接口隔离原则,都是反映出继承链要合理,不要贪多的思维。


作者:Yj家的孺子牛
链接:https://juejin.cn/post/7158466528013697038
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册