ART 虚拟机入门 | 青训营笔记

217 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

01 本堂课重点内容:

  • 了解ART虚拟机相关知识
  • 学习我们的对象是怎么分配出来的?

02 详细知识点介绍:

2.1什么是ART

Google官方的定义为:Android Runtime (ART) 是 Android 上的应用和部分系统服务使用的托管式运行时。ART 及其前身 Dalvik 最初是专为 Android 项目打造的。作为运行时的 ART 可执行 Dalvik 可执行文件并遵循 Dex 字节码规范。 其主要有以下几个功能:

  • 解决垃圾回收 (GC) 问题
    垃圾回收 (GC) 会耗费大量资源,这可能有损于应用性能,导致显示不稳定、界面响应速度缓慢以及其他问题。ART 通过以下几种方式对垃圾回收做了优化:
    • 大多采用并发设计,具有一次 GC 暂停
    • 并发复制,可减少后台内存使用和碎片
    • GC 暂停的时间不受堆大小影响
    • 在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短
    • 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见
  • 预防 JNI 问题
    ART 的 JNI 比 Dalvik 的 JNI 更为严格一些。使用 CheckJNI 模式来捕获常见问题是一种特别实用的方法。从而可以检查 JNI 代码中的垃圾回收问题以及进行错误处理。
  • 预防堆栈大小问题
    Dalvik 拥有单独的原生代码堆栈和 Java 代码堆栈,并且默认的 Java 堆栈大小为 32KB,默认的原生堆栈大小为 1MB。ART 拥有统一的堆栈,用于改善局部位置。通常情况下,ART Thread 堆栈大小应与 Dalvik 堆栈大小近乎相同。但是,如果您显式设置堆栈大小,则可能需针对 ART 中运行的应用重新访问这些值。
  • 对象模型更改
    Dalvik 不应允许子类重写软件包私有的方法。在这类情况下,ART 会发出警告:
Before Android 4.1, method void com.foo.Bar.quux()
would have incorrectly overridden the package-private method in
com.quux.Quux

如果您希望在其他软件包中重写某个类的方法,请将该方法声明为 public 或 protected

2.2对象

在对象这一节,我们主要探讨以下问题:

image.png

  • 类主要描述的是一个对象的内存布局和函数信息 类和对象的关系如下图所示,图片来源于ART虚拟机 | Java对象和类的内存结构 - 掘金 (juejin.cn) image.png
  • 内存分配
    APP的java对象内存分配上是托管到VM来处理的,并不会直接向操作系统去申请,实际上对OS内存的占用和内存布局,是VM控制的。
    • 应用: APP
    • 堆: ART vm heap、native heap
    • 操作系统: linux kernel 内存管理
  • 内存回收
    • GC:垃圾回收(Garbage Collection),需要定期查找系统内不用的对象,并且释放占用的内存,ART用的这种模式。
    • RC:引用计数(Reference Counting),指的是对一个对象引用进行计数,多一个引用者,就+1,少一个就-1,为O就释放,典型的如IOS的swift就使用RC进行内存管理。

2.3 执行

  • 虚拟机的执行方式主要有三种:解释执行、JIT与AOT,其中解释执行由解释器完成,JIT和OAT采用的是编译之后,此时直接执行的已经是指令了。

image.png

  • 延迟绑定:
    • 绑定的越迟,动态性越好,性能越差
    • 绑定的越早,动态性越差,性能越好
  • 栈管理: ART对于解释执行和编译后指令采用两种不同的策略:
    • 对于解释执行,栈托管到虚拟机完成。
    • 对于编译后的,压栈处理和native代码是一样的,遵从对应指令集的约定

03 课后个人总结:

本节课通过老师生动形象的讲解,对ART虚拟机有了一个基础的认识,然后对对象和执行的相关知识有了基础的了解。

04 参考文献:

  1. 在 Android Runtime (ART) 中验证应用行为  |  Android 开发者  |  Android Developers
  2. Android Runtime (ART) 和 Dalvik  |  Android 开源项目  |  Android Open Source Project
  3. 青训营相关资料:【Android 客户端专场 学习资料三】第四届字节跳动青训营 - 掘金 (juejin.cn)
  4. ART虚拟机 | Java对象和类的内存结构 - 掘金 (juejin.cn)