ART虚拟机

ART执行的字节码所以速度会很快,使用AOT(AHead of Time)相对于JIT(Just In Time)会在应用创建的时候将dex编译成字节码时时间会比较长占用空间会比较大

之所以会无缝的替换是因为他实现了虚拟机的接口

内存回收机制

对象的是否被引用 引用链

清除算法 标记-清除

堆分配

ART虚拟机_第1张图片

ImageSpace 包含了用于预加载系统类对象,这些对象都是在创建oat时创建得到的,存储在[email protected]中,以后启动可以不需要加载系统类对象节省时间

zygote 存储zygote继承创建的对象

allocation 和dvk中的active一样对象的创建都是在这个内存中实现的

large object 分配大对象的空间


因为写复制机制,zygote进程回合应用进程公用imageSpace和zygoteSpace


Art同样使用标记-清除算法执行清除对象的操作

不同的是他有6中不同的算法,同步三种,异步三种,分别为

ART虚拟机_第2张图片

MarkSweep类型的垃圾收集器,用来收集在Zygote Space和Allocation Space上分配的对象。

PartialMarkSweep类型的垃圾收集器,用来收集在Allocation Space上分配的对象

StickyMarkSweep类型的垃圾收集器,用来收集上次GC以来分配的对象




并行GC和非并行GC的区别在于:

        1. 非并行GC的标记阶段和回收阶段是在挂住所有的ART运行时线程的前提下进行的,因此,只需要执行一次标记即可。

        2. 并行GC的标记阶段只锁住了Java堆,因此它不能阻止那些不是正在分配对象的ART运行时线程同时运行,而这些同进运行的ART运行时线程可能会引用了一些在之前的标记阶段没有被标记的对象。如果不对这些对象进行重新标记的话,那么就会导致它们被GC回收,造成错误。因此,与非并行GC相比,并行GC多了一个处理脏对象的阶段。所谓的脏对象就是我们前面说的在GC标记阶段同时运行的ART运行时线程访问或者修改过的对象。

        3. 并行GC并不是自始至终都是并行的,例如,处理脏对象的阶段就是需要挂起除GC线程以外的其它ART运行时线程,这样才可以保证标记阶段可以结束。

        从前面ART运行时垃圾收集机制简要介绍和学习计划一文可以知道,GarbageCollector类有三个直接或者间接的子类MarkSweep、PartialMarkSweep和StickyMarkSweep都可以用来执行垃圾回收,其中,PartialMarkSweep类又是从MarkSweep类直接继承下来的,而StickyMarkSweep类是从PartialMarkSweep类直接继承下来的。MarkSweep类用来回收Zygote Space和Allocation Space的垃圾,PartialMarkSweep类用来回收Allocation Space的垃圾,StickyMarkSweep类用来回收上次GC以来在Allcation Space上分配的最终又没有被引用的垃圾。



参考文章

https://blog.csdn.net/luoshengyang/article/details/39256813

https://blog.csdn.net/luoshengyang/article/details/42072975

你可能感兴趣的:(Android)