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

121 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

一、本堂课重点内容:

01.对象篇

  • 对象是谁--类的管理
  • 对象从哪里来--内存分配
  • 对象到哪里去--内存回收

02.执行篇

  • 搬砖的姿势--虚拟机的执行方式
  • 开始和结束--栈管理
  • 高效的执行--多线程

二、详细知识点介绍

01.对象篇

image.png

1.类管理:决定一个对象的大小和行为 类主要描述的是一个对象的内存布局和函数信息

内存布局:类成员的大小,类型,和排布

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

2.内存分配——分配器

APP的java对象内存分配上是托管到VM来处理的,并不会直接向操作系统去申请,实际上对OS内存的占用和内存布局,是VM控制的(预留-扩展)

image.png

3.内存回收——两种思路

  • GC:垃圾回收(Garbage Collection),需要定期查找系统内不用的对象,并且释放占用的内存
  • RC:引用计数(Reference Counting),指的是对一个对象引用进行计数,多一个引用者,就+1,少一个就-1,为0就释放,典型的如IOS的swift就使用RC进行内存管理

image.png

本章小结

  • 我们怎么决定一个对象的大小,内存的布局
  • 我们怎么分配出一个对象
  • 我们怎么回收一个对象

02.执行篇

1.虚拟机的执行方式-OAT OAT(或者AOT),和IT不同,是在程序运行之前,对APK中的函数进行编译。

  • 和程序是否运行无关
  • 编译的范围不是以函数为单位,而是以dex为单位的。
  • 结果会持久化。

2.虚拟机的执行方式-延迟绑定 绑定的越迟,动态性越好,性能越差 绑定的越早,动态性越差,性能越好

3.栈管理 ART对于解释执行和编译后指令采用两种不同的策略: 对于解释执行,栈托管到虚拟机完成。 对于编译后的,压栈处理和native代码是一样的,遵从对应指令集的约定

4.栈管理-

简单总结下通过上面的例子,我们可以得出如下两个不同:

  1. 压栈-出栈的速度不同,解释执行的速度慢
  2. 解释执行的栈结构是托管的,编译执行的栈结构是遵从虚拟机规则的
  3. 解释执行传递参数有额外的空间成本,编译执行没有
  4. 不同执行方式之间调用切换采用trampoline/bridge进行
  5. 思考一下,回栈除了函数返回,还有什么可能会导致回栈?

本章小结

  1. 函数有哪几种执行方式?
  2. 出现问题了,异常被抛出的?
  3. 提高效率引入并发,并发怎么控制的?

三、实践练习例子:

image.png

image.png

image.png

四、课后个人总结:

学完本节课,能够初步进入ART虚拟机的大门,对于执行篇的内容还不是特别了解,后面要加强理解,继续加油