这是我参与「第四届青训营 」笔记创作活动的第7天 主要为思维导图大纲,收集课堂要点和一些补充知识 欢迎补充&指正
打开ART虚拟机的大门
1.是什么
Android Runtime
演进:Dalvik ->ART
ART整体架构
-
1.compiler:JIT/AOT
-
2.interpreter
-
3.runtime
- 内存管理
- 异常
- 线程
- 类管理
- string
- intrinsic
- 调试
- jni
- monitor
1.1对象篇
对象分配的大小怎么确定的 -类
-
内存布局
- 类成员的大小、类型、排布
-
函数信息
- 虚表的信息:某个函数定义在当前函数表的第几个信息
-
Object基类
- klass_:一个指向该对象所属类的类对象
- monitor:存储了hash code和锁信息
-
类加载
- 继承:儿子的实际大小=爷爷大小+爸爸大小+儿子大小
- 双亲继承:两个爸爸(两条继承链),定义沿规定路线,只走一条(一致性 )
对象怎么分配的 - 内存分配
-
VM虚拟机处理
-
分配器
-
TLAB
- 线程缓存(小量内存:临时变量)
-
ROSallocator
- 较大对象:数组、容器
-
LOSallocator
- 更大对象:bitmap、图片
-
-
内存碎片
- 尽可能用连续内存
对象怎么回收 - 内存回收
-
GC垃圾回收:定期集中查找系统不用对象
-
及时,但认不出互相引用的环引用(强引用)
-
引入弱引用和手动标记
- 强引用:直接持有的,不会被回收
- 软引用:内存不够时回收
- 弱引用:只要触发GC就会被回收
-
GC roots:判断内存是否有用
-
不能被释放:
- 栈
- static变量
- native ref
- vm保留
-
方法
-
tracing GC(前台应用)
- 从roots遍历,释放掉没有holder的object(没有holder的)
-
copying GC(后台应用)
- 从roots遍历,把有用的对象拷贝到另一个区域,然后集中释放当前区域内存
-
-
-
-
RC引用计数:当对象引用进行计数,为0时释放该对象
回收之后
-
finalize方法:跟随对象的生命周期,清理掉绑定的native资源
- 每个对象的finalize方法只执行一次,再次激活的对象再不会触发finalize
1.2执行篇
1.interpreter
- 编译执行并且profile打分,分值到达再到JIT编译(同时执行)(栈托管到虚拟机)比较慢
2.compiler:JIT/AOT
- AOT:在程序执行之前,对APK的函数进行编译,以dex为单位,结果持久化
延迟绑定
- 绑定越迟,动态性越好,性能越差
- 发布apk不能绑定,只能在端侧获取全部信息
异常
- 1.回一级栈看是否要,不要就退出
多线程
-
原子性问题
-
引用sync机制加锁解锁
-
shadow monitor:保存lock指针
-
胖锁与瘦锁
- 瘦锁:不断轮询
- 胖锁:隔一段时间访问
-