一、GC分类
1、kGcCauseForAlloc 当没有足够的内存分配时触发
2、kGcCauseBackground 当已使用的内存超过最大值时触发
3、kGcCauseExplicit 当使用System.GC时触发
二、GC守护线程
1、ReferenceQueueDaemon:引用队列守护线程。我们知道,在创建引用对象的时候,可以关联一个队列。当被引用对象引用的对象被GC回收的时候,被引用对象就会被加入到其创建时关联的队列去。这个加入队列的操作就是由ReferenceQueueDaemon守护线程来完成的。这样应用程序就可以知道那些被引用对象引用的对象已经被回收了。
2、 FinalizerDaemon:析构守护线程。对于重写了成员函数finalize的对象,它们被GC决定回收时,并没有马上被回收,而是被放入到一个队列中,等待FinalizerDaemon守护线程去调用它们的成员函数finalize,然后再被回收。
3、 FinalizerWatchdogDaemon:析构监护守护线程。用来监控FinalizerDaemon线程的执行。一旦检测那些重定了成员函数finalize的对象在执行成员函数finalize时超出一定的时候,那么就会退出VM。
4、 HeapTrimmerDaemon:堆裁剪守护线程。用来执行裁剪堆的操作,也就是用来将那些空闲的堆内存归还给系统。
5、GCDaemon:并行GC线程。用来执行并行GC。
三、GC方式
非并行(过程):
1、调用子类实现的成员函数InitializePhase执行GC初始化阶段。
2、挂起所有的ART运行时线程。
3、调用子类实现的成员函数MarkingPhase执行GC标记阶段。
4、调用子类实现的成员函数ReclaimPhase执行GC回收阶段。
5、恢复第2步挂起的ART运行时线程。
6、调用子类实现的成员函数FinishPhase执行GC结束阶段。
并行(过程)
1、调用子类实现的成员函数InitializePhase执行GC初始化阶段。
2、获取用于访问Java堆的锁。
3、调用子类实现的成员函数MarkingPhase执行GC并行标记阶段。
4、释放用于访问Java堆的锁。
5、挂起所有的ART运行时线程。
6、调用子类实现的成员函数HandleDirtyObjectsPhase处理在GC并行标记阶段被修改的对象。。
7、恢复第4步挂起的ART运行时线程。
8、重复第5到第7步,直到所有在GC并行阶段被修改的对象都处理完成。
9、获取用于访问Java堆的锁。
10、调用子类实现的成员函数ReclaimPhase执行GC回收阶段。
11、释放用于访问Java堆的锁。
12、调用子类实现的成员函数FinishPhase执行GC结束阶段。