这是我参与「第四届青训营 」笔记创作活动的第8天
一、ART演进
最开始是Dalvik,后来有了ART。
二、对象篇
类的管理
类主要描述的是一个对象的内存布局和函数信息。
内存布局:类成员的大小、类型、布局。
类加载
一个类分配的对象大小,是由继承链决定的,Java的类,是在第一次使用的时候才会进行加载
双亲继承
保证程序执行结果是可预知的
内存分配
APP的java内存分配上是托管到VM来处理的,并不会直接向操作系统去申请,实际上对OS内存的占用和内存布局,是VM控制的(预留-扩展)。
- TLAB:给每个线程开一个小缓存,或者临时对象。
- ROSallocator:中等大小的数组或者容器。
- LOSallocator:大量内存例如bitmap存储图片,内存动用比较慢。
ART内存分配的根本原理还是给使用者在最优的范围内找到一块大小符号的连续内存。
内存回收
GC:垃圾回收,需要定期查找系统内不用的对象,并且释放占用的内存。
RC:引用计数,指的是对一个对象引用进行计数,多一个引用者,就加一,少一个就减一,为零就释放。典型的如IOS的swift就使用RC进行内存管理。但是如果存在互相引用,RC认不出环引用
三、执行篇
虚拟机的执行方式
解释执行:JIT和OAT采用的是编译之后,此时直接执行的已经是指令了
JIT在解释执行是会有一个文件,编译后进行OSR替换,一边执行一边替换
OAT是在程序运行之前,对APK中的函数进行编译,和程序是否运行无关,编译范围不是以函数为单位而是以DEX为单位的,结果会持久化。