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

103 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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指针

    • 胖锁与瘦锁

      • 瘦锁:不断轮询
      • 胖锁:隔一段时间访问