# 打开ART虚拟机的大门|青训营笔记

81 阅读2分钟

打开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-