ART虚拟机GC原理分析讲解,art虚拟机gc原理


1.垃圾回收机制

垃圾回收机制全称为Garbage Collection,简称GC,是Android系统中虚拟机提供的一套自动内存管理机制。

传统的C/C++是没有GC的,初始化对象然后分配内存空间需要手动地malloc/new,当需要销毁对象时候需要手动地free/delete。

垃圾回收机制可以根据一定的规则判断出内存空间中的“垃圾”,自动释放“垃圾”占用的内存。不过付出的代价是GC耗费额外的系统资源,并会暂停用户进程,严重时候明显影响用户体验,例如系统卡顿、动画掉帧等。

一旦出现内存泄漏或溢出的问题,如果开发人员不了解虚拟机内存管理机制,那么解决这类问题就变得棘手。

2.ART虚拟机的GC算法

Android 5.0以后,Google用ART虚拟机替换掉Dalvik虚拟机,为了更好地利用ART虚拟机自动内存管理的特性,应用开发人员有必要深入理解ART虚拟机垃圾回收机制的实现。

主流GC算法包括:引用计数算法(Reference counting)、标记-清除算法(Mark-Sweep GC)、复制算法(Copying GC)、标记-压缩算法(Mark-Compact GC),后面三种算法属于追踪式算法.

引用计数法 [系统引用复杂时候内存消耗过大]

这里写图片描述

标记-清除算法

这里写图片描述

1 标记阶段

首先标记根集对象,包括当前线程栈中的对象、当前进程所有已经加载的类及类中的静态引用等。然后从根集对象开始递归标记出所有可达对象。

2 暂停阶段

标记阶段在标记根集的时候没有暂停其他线程,所以在标记的过程中对象的引用关系可能会发生变化,如果不处理这种变化就会导致对象的错标或漏标,后面清扫垃圾时就有可能把存活对象也回收了,导致程序的非正常运行。所以需要有个暂停阶段,来处理标记阶段中对象的引用关系发生变化的对象。

3 清除阶段

经过了前面的两个阶段,标记清除算法认为的存活对象都在标记位图(Mark Bitmap)中标记出来了。接下来回收没有被标记的内存块。

4 终结阶段

在回收垃圾后有个收尾工作,会对经过垃圾回收后的堆根据需求进行裁剪,也会对堆的预留空闲内存进行重新设定。

标记-压缩算法

这里写图片描述

复制算法

这里写图片描述

3.ART虚拟机的堆结构

在了解回收机制之前,需要先了解下内存堆的内部分布,如下图:

这里写图片描述

4.ART堆内存GC策略

对于标记清除算法,最大的缺点就是容易造成内存碎片。执行每一次标记清除算法对于系统内存的消耗也是巨大的。为了优化原有的Java内存标记清除算法,ART提供了三种GC策略:

分代垃圾回收Sticky GC :只回收上一次GC到本次GC之间申请的内存。 局部垃圾回收Partial GC:回收除了Image Space和Zygote Space空间以外的其他内存垃圾。 全局垃圾回收Full GC:除了Image Space之外的空间的内存垃圾。

策略的对比:

GC 暂停时间:Sticky GC < Partial GC < Full GC 回收垃圾的效率:Sticky GC > Partial GC > Full GC

执行GC的三个阶段:

阶段一:首先会进行一次轻量级的GC, GC完成后尝试分配。如果分配失败,则选取下一个GC策略,再进行一次轻量级GC。每次GC完成后都尝试分配,直到三种GC策略都被轮询了一遍还是不能完成分配,则进入下一阶段。 阶段二:允许堆进行增长的情况下进行对象的分配,如果还是分配失败,则会进行一次允许回收软引用的GC。 阶段三:如果对象是不可移动对象,则ART会把它分配在Non-Moving Space。如果对象是可移动的对象,那么就进行一次同构空间压缩(Main Space),压缩后也增加了分配成功的可能性。

相关内容