android Q 对ART的优化
简单说两大优化,提升性能
-
JIT优化
Android Q 大幅改进了 ART 运行时。所谓运行时改进就是对编译器(JIT)的改进,开发者无需进行任何操作,便可有效缩短应用的启动时间,减少内存消耗,并提高应用的运行流畅度。
ART 配置文件,允许 ART 在应用开始运行之前就预编译一部分代码。基于云的编译文件适用于所有应用,而且运行 Android P 或更高版本系统的设备目前已提供相关支持。 -
GC优化
ART 的并发复制垃圾收集器 (Concurrent Copying Garbage Collector) 中添加了分代收集机制 (Generational Garbage Collection)。分代算法可以将新生代的对象单独收集出来,与 full-heap GC 相比成本更小。引入分代算法后,ART 垃圾回收速度和 CPU 利用效率有了明显提升,在减少垃圾的同时,让应用可以在低端设备上更流畅地运行
ART编译器-JIT
Android 运行时 (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器,该编译器可以在 Android 应用运行时持续提高其性能。JIT 编译器补充了 ART 当前的预先 (AOT) 编译器的功能,有助于提高运行时性能,节省存储空间,以及加快应用及系统更新速度。相较于 AOT 编译器,JIT 编译器的优势也更为明显,因为它不会在应用自动更新期间或重新编译应用(在无线下载 (OTA) 更新期间)时拖慢系统速度。
尽管 JIT 和 AOT 使用相同的编译器,它们所进行的一系列优化也较为相似,但它们生成的代码可能会有所不同。JIT 会利用运行时类型信息,可以更高效地进行内联,并可让堆栈替换 (OSR) 编译成为可能,而这一切都会使其生成的代码略有不同。
JIT架构JIT编译
image.png1、用户运行应用,而这随后就会触发 ART 加载 .dex 文件。
- 如果有 .oat 文件(即 .dex 文件的 AOT 二进制文件),则 ART 会直接使用该文件。虽然 .oat 文件会定期生成,但文件中不一定会包含经过编译的代码(即 AOT 二进制文件)。
- 如果 .oat 文件不包含编译的代码,ART 会通过 JIT 和解释器执行 .dex 文件。
1、针对任何未根据 speed 编译过滤器编译的应用启用 JIT(也就是说,要尽可能多地编译应用中的代码)。
2、将 JIT 配置文件数据转存到只限应用访问的系统目录内的文件中。
3、AOT 编译 (dex2oat) 守护进程通过解析该文件来推进其编译。
JIT工作流程
-
分析信息会存储在代码缓存中,并会在内存紧张时作为垃圾被回收。
-
无法保证在应用处于后台运行状态时所捕获的快照能够包含完整的数据(即 JIT 编译的所有内容)。
-
该过程不会尝试确保记录所有内容(因为这将影响运行时性能)。
-
-
方法可能有三种不同的状态:
- 已经过解释(dex 代码)
- 已经过 JIT 编译
- 已经过 AOT 编译
如果同时存在 JIT 和 AOT 代码(例如,由于反复进行逆优化),经过 JIT 编译的代码将是首选代码。
-
在不影响前台应用性能的情况下运行 JIT 所需的内存取决于相关应用。大型应用比小型应用需要更多内存。一般来说,大型应用所需的内存稳定维持在 4 MB 左右。
周末和同学吃饭,得知Android面试问JVM,虽说Java 虚拟机(JVM)和Android虚拟机十分相似,但是完全驴头不马嘴根本不是同一个东西,说什么好呢 !盲目装逼的问题该怎么回答 ?! 准备抽时间总结下Android常识
网友评论