Garbage Collection (垃圾回收)简单的来说是一种自动化的内存管理机制。Android系统中不管是Dalvik 或Art 它们使用的垃圾回收机制都是以Mark-Sweep为根基演变过来的。
Mark的意思是“标记” 在这里表示遍历处理内存中的对象,并处理统计,对应的Sweep的意思是清理,根据Mark出来的对象完成垃圾回收。
Mark-Sweep总共分三个步骤:
1、系统中所有Objects 对应的Mark bit 都会被清空。
2、Mark 阶段。从GC Root开始遍历系统中所有的对象——只要从“根”开始有一条路径可以达到某个Object,那么我们就可以将它的状态标记为“被引用”,或者更直白的说 “还有利用价值”。
3、系统开始线性的处理堆中的所有元素,并将那些没有被标记为“有利用价值”做Sweep 处理。
下面我们针对上面的说法进行补充说明
GC出发时机:
我们首先知道,java是有指针的,java的指针属于智能指针(想了解的话可以去查下资料,后期我会对智能指针进行补充)实现内存自动化管理。对象引用每次变更都需要调整计数,直到Count值为 0 时才回收内存——GC触发条件是 Count 值为 0。相对Reference Counting ,GC采用的触发方式在某种程度上效率更高,因为它不需要频繁的对各对象调整计数值,而是选择在某种特定情况下进行处理。
在Android 中发生GC的场景有下面几种:
(1)、堆内存已满(GC_FOR_MALLOC)而你尝试去分配新内存的情况。
(2)、当堆内超过某个特定的阀值(GC_CONCURRENT)时,触发