打开 ART 虚拟机的大门 | 青训营笔记

152 阅读2分钟

关键词:双亲继承、VM控制预留

这是我参与「第四届青训营 」笔记创作活动的第14天。本文主要对ART安卓虚拟机课程进行学习与梳理。

ART演进

image.png

安卓整体架构

黄色部分,即ART,为APP和system server进程提供运行环境,包括JAVA语法支持、托管、性能优化、debug等等一系列的能力。

image.png

ART架构

ART可粗略划分为两个层级:执行层与runtime层。

  • 执行层否则直接面向java代码的产物进行翻译或者编译执行。
  • runtime层提供java语法特性和其他一些支撑运行的底层机制。

image.png

对象是怎么分配的

对象

  1. 对象大小-类
  • classloader & 双亲继承

类主要描述一个对象的内存布局和函数信息

  • 内存布局:类成员的大小、类型、排布
  • 函数信息:主要为虚表的信息:某个函数定义在当前类函数表的第几个位置。因为java是支持继承的,因此类的内存布局和函数虚表需要做继承链全展开以后才能真正确认。(动态性的来源 )

Object基类

image.png

1.1 类加载

一个类分配的对象大小,有继承链决定的

JAVA的类,在第一次使用时,才会进行加载

儿子类的大小,即儿子类的所有成员大小加上爸爸类、爷爷类等等所有成员的大小

image.png

1.2 双亲继承

保证执行结果可预知,确定继承链。

1.3 合理的继承抽象的好处

image.png 2. 内存分配

2.1 VM控制预留

image.png

2.2 不同分配器

image.png

bitmap,在Android高版本,就被隐藏到来native,不直接使用虚拟堆

image.png 大数据需要从池中取,需要时间与精力

预留扩展

  • 内存碎片 尽量连续存储

  • 分配算法

    • 伙伴算法
    • TLAB
  1. 内存回收
  • GC演进

垃圾回收

image.png

触发GC的条件 image.png

GC roots的概念:

四个起点(被用到的不可释放

  1. static变量
  2. native ret
  3. VM保留

image.png

3.1 搬运的两种方式

需要的东西多 用copyGC不经济 image.png

3.2 回收之后 按需取用

不要用finalize();若在激活前调用该方法,那之后便不能再使用它了

image.png

  • 回收算法
  • 进阶算法

执行

image.png

  1. 执行方式

JIT:

image.png

OAT:

image.png

延迟绑定:

image.png

装在安卓的手机上才查找:在端侧才获取自己类的完整信息(与安卓糟糕的生态环境有关)

  1. 栈管理

栈管理的不同:

image.png 一种为抛出异常 4. 异常 5. 多线程

瘦锁与胖锁

image.png 瘦胖锁切换

虚拟机为了保证代码高效顺利执行,提供了哪些机制

推荐书籍

image.png

使用虚拟机的语言相比编译型语言有哪些优势和劣势?

虚拟机语言动态性会高一些,作用域有限,一旦书写便确定了,不能再优化。