这是我参与「第四届青训营 」笔记创作活动的第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对象
在对象这一节,我们主要探讨以下问题:
- 类主要描述的是一个对象的内存布局和函数信息
类和对象的关系如下图所示,图片来源于ART虚拟机 | Java对象和类的内存结构 - 掘金 (juejin.cn)
- 内存分配
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采用的是编译之后,此时直接执行的已经是指令了。
- 延迟绑定:
- 绑定的越迟,动态性越好,性能越差
- 绑定的越早,动态性越差,性能越好
- 栈管理:
ART对于解释执行和编译后指令采用两种不同的策略:
- 对于解释执行,栈托管到虚拟机完成。
- 对于编译后的,压栈处理和native代码是一样的,遵从对应指令集的约定
03 课后个人总结:
本节课通过老师生动形象的讲解,对ART虚拟机有了一个基础的认识,然后对对象和执行的相关知识有了基础的了解。