这是我参与「第四届青训营 」笔记创作活动的第9天
本节课的主要内容: 打开ART虚拟机的大门
1,对象篇
类管理-决定一个对象的大小和行为
类主要描述的是一个对象的内存布局和函数信息
内存布局:类成员的大小,类型和排布
函数信息:主要是虚表的信息,某个函数定义在当前函数表的第几个位置
类管理-类加载
一个类分配的对象大小,是由继承链决定的
JAVA的类,在第一次使用的时候,才会进行加载
类管理-双亲继承
本质上,双亲委派就是人为划定的一个规矩,目的是为了保证系统内同一个类的一致性
内存分配-分配器
APP的java对象内存分配上是托管到VM来处理的,并不会直接向操作系统去申请,实际上对Os内存的占用和内存布局是VM控制的。
内存分配-内存碎片
ART内存分配的根本原理,还是给使用者在最优的范围内找到一块大小符合的连续内存。
内存回收-两种思路
GC:垃圾回收,需要定期查找系统内不用的对象,并且释放占用的内存。
RC:引用计数,指的是对一个对象引用进行计数,多一个引用者,就+1,少一个引用者,就-1,为0就释放典型的如IOS的swift就使用RC进行内存管理。
内存回收-触发GC的条件
1,我们想要不被预期外的GC导致卡顿,可以考虑适当的预留内存
2,大小有上限可预期的情况,new一个大数组,可能比分配一大堆放到容器里要好
2,执行篇
虚拟机的执行方式-OAT
OAT(或者AOT),和JIT不同,是在程序运行之前,对APK中的函数进行编译。
1,和程序是否运行无关
2,编译的范围不是以函数为单位,而是以dex为单位的。
3,结果会持久化。
虚拟机的执行方式-延迟绑定
绑定的越迟,动态性越好,性能越差
绑定的越早,动态性越差,性能越好
栈管理
ART对于解释执行和编译后指令采用两种不同的策略:
1,对于解释执行,栈托管到虚拟机完成。
2,对于编译后的,压栈处理和native代码是一样的,遵从对应指令集的约定
3,总结
由本次所学课程我们可以了解到ART可以粗略的划分成两个层级,执行层和runtime层,执行层负责直接面向java代码的产物,来翻译或者编译执行。runtime层则是提供java语法特性和其他一些支撑运行的底层机制。