这是我参与「第四届青训营」笔记创作活动的第八天。这篇笔记主要是对安卓客户端“打开ART虚拟机的大门”这节课中对象篇的记录。
笔记
ART演进
1.0 Dalvik
使用解释+JIT
2.0 ART(4.4开始-5.0正式)
优化GC;引入AOT,安装时执行
3.0 ART7.0
三种执行方式并存,引入speed profile
对象篇
对象的生命旅程
对象分配:分配多大(类),怎么分配(内存管理)
对象使用:执行类的方法,访问类的成员
对象销毁:内存回收(GC,清理)
类管理:决定一个对象的大小和行为
类主要描述的是一个对象的内存布局和函数信息
内存布局:类成员的大小,类型,排布
函数信息:主要是因为虚表的信息:某个函数定义在当前类函数表的几个位置。因为java是支持继承的,因此类的内存布局和函数虚表需要做继承链全展开以后才能真正确认(这也是动态性的来源)
类加载
一个类分配的对象大小,是由继承链决定的
JAVA的类,是在第一次使用的时候,才会进行加载。
双亲继承
保证程序继承的结果是可预知的
怎么分配-分配器
APP的java对象内存分配是托管到VM来处理的,并不会直接向操作系统申请,实际上对OS内存的占用和内存布局,是VM控制的。
不同分配器的特点
内存由小到大:TALB(临时变量)->ROSallocator(数组/容器)->LOSalloctor(bitmap存储图片)
内存碎片
ART内存分配的根本原理,还是给使用者再最优的范围内找到一片大小合适的连续内存。
内存回收
GC:垃圾回收Garbage Collection,需要定期查找系统内不用的对象,并且释放占用的内存。
RC:引用计数Reference Counting,指的是对一个对像引用进行计数,多一个引用者,就+1,少一个就-1,为0就释放。典型的如IOS的swift就使用RC进行内存管理。
ART的引用
强引用:直接持有的
软引用:内存不够时才会回收
弱引用:触发GC时就会回收
触发GC的条件
1.没内存了
2.手机觉得该GC了(VM堆占用达到水位,系统内存紧张,就是想触发)
GC的方式
- 不能被释放:栈,static变量,native ref,VM保留
tracing GC:从roots开始遍历,所有mark的对象都是有holder的,释放掉没有holder的object
copying GC:从roots遍历,把有用的对象拷贝到另一个区域,然后集中释放掉当前区域的内存
回收之后
finalize方法一般用来跟随对缘的生命周期,清理掉绑定的native资源
但注意,一个对象的finalize方法只会执行一次,再次激活之后的对像是不会触发finalize的。
总结
在本次课程中,我了解到了ART虚拟机中对象的相关知识,包括类管理,类加载,分配器,内存回收等知识。