打开ART虚拟机的大门|青训营笔记
这是我参与「第四届青训营 」笔记创作活动的第8天
01 对象篇
对象分配 分配多大:类 怎么分配:内存管理
- JAVA源码 OBJECT基类=KLASS(指针)+MONITOR
- 一个类分配的对象大小,是由继承链决定
- JAVA的类,是在第一次使用的时候,才会进行加载
- 双亲继承:人为委派的继承链
- 合理的继承抽象
-
- 小量内存:临时变量TLAB;
-
- 中等内存:数组/容器ROSALLOCATOR
-
- 大量内存:bitmap存储图片LOSALLOCATOR
- 内存碎片:希望可用内存尽可能连续
对象使用: 执行类的方法 访问对象成员
对象销毁 内存回收:
- GC:垃圾回收,定期查找系统内不用的对象,并且释放占用的内存;ANDROID
- RC:引用计数,对一个对象引用进行计数,多一个引用者+1,为0时回收;IOS
- RC认不出环引用,引入弱引用
- 弱引用:只有GC不够时才会触发
- 软引用:内存不够时引用 触发GC的条件
- 没内存了
- VM堆占用达到水位
- 系统内存紧张
- 无理由GC GC方式 TRACING GC:从root开始遍历,MARK了的对象都有holder,释放掉没holder的对象
| GC的种类 | ||
|---|---|---|
| 前台GC | 后台GC | |
| 使用场景 | 应用在前台的进程 | 非前台应用进程service/push进程 |
| 算法 | tracing GC(mark-sweep) | coping GC(compacting) |
| 速度 | 快 | 慢 |
| 内存碎片 | 有 | 无 |
| 额外空间 | 不需要 | 需要 |
- 垃圾占比多的用copy GC
- 一个对象的finalize只会执行一次→少用finalize
02 执行篇
执行方式
- 解释执行->dex code
- JIT->profile->JIT compile->JIT code
- AOT->speed profile->dex2oat->AOT code
JIT具体执行时会给profile,解释执行选出最该执行的函数(OSR:ON-STACK REPLACEMENT
OAT:在程序执行之前,对APK中的函数进行编译
函数执行的特点-延迟绑定 绑定的越迟,动态性越好,性能越差 往往只有端侧能获得完整信息
JAVA引入sync机制来加锁解锁 OBJECT基类的结构中,shadow monitor 瘦锁:轮询密度高,spinlock 胖锁:反应慢,mutexlock
《深入理解ANDROID JAVA虚拟机ART》 《虚拟机设计与实现》
Java- mvvm- database -mainviewmodel-