这是我参与「第四届青训营 」笔记创作活动的第3天
一、本堂课重点内容:
01.对象篇
- 对象是谁--类的管理
- 对象从哪里来--内存分配
- 对象到哪里去--内存回收
02.执行篇
- 搬砖的姿势--虚拟机的执行方式
- 开始和结束--栈管理
- 高效的执行--多线程
二、详细知识点介绍
01.对象篇
1.类管理:决定一个对象的大小和行为 类主要描述的是一个对象的内存布局和函数信息
内存布局:类成员的大小,类型,和排布
函数信息:主要是虚表的信息:某个函数定义在当前类函数表的第几个位置 因为java是支持继承的,因此类的内存布局和函数虚表需要做继承链全展开以后才 能真正确认。(这也是动态性的来源)
2.内存分配——分配器
APP的java对象内存分配上是托管到VM来处理的,并不会直接向操作系统去申请,实际上对OS内存的占用和内存布局,是VM控制的(预留-扩展)
3.内存回收——两种思路
- GC:垃圾回收(Garbage Collection),需要定期查找系统内不用的对象,并且释放占用的内存
- RC:引用计数(Reference Counting),指的是对一个对象引用进行计数,多一个引用者,就+1,少一个就-1,为0就释放,典型的如IOS的swift就使用RC进行内存管理
本章小结
- 我们怎么决定一个对象的大小,内存的布局
- 我们怎么分配出一个对象
- 我们怎么回收一个对象
02.执行篇
1.虚拟机的执行方式-OAT OAT(或者AOT),和IT不同,是在程序运行之前,对APK中的函数进行编译。
- 和程序是否运行无关
- 编译的范围不是以函数为单位,而是以dex为单位的。
- 结果会持久化。
2.虚拟机的执行方式-延迟绑定 绑定的越迟,动态性越好,性能越差 绑定的越早,动态性越差,性能越好
3.栈管理 ART对于解释执行和编译后指令采用两种不同的策略: 对于解释执行,栈托管到虚拟机完成。 对于编译后的,压栈处理和native代码是一样的,遵从对应指令集的约定
4.栈管理-
简单总结下通过上面的例子,我们可以得出如下两个不同:
- 压栈-出栈的速度不同,解释执行的速度慢
- 解释执行的栈结构是托管的,编译执行的栈结构是遵从虚拟机规则的
- 解释执行传递参数有额外的空间成本,编译执行没有
- 不同执行方式之间调用切换采用trampoline/bridge进行
- 思考一下,回栈除了函数返回,还有什么可能会导致回栈?
本章小结
- 函数有哪几种执行方式?
- 出现问题了,异常被抛出的?
- 提高效率引入并发,并发怎么控制的?
三、实践练习例子:
四、课后个人总结:
学完本节课,能够初步进入ART虚拟机的大门,对于执行篇的内容还不是特别了解,后面要加强理解,继续加油