art知识简要概括

一、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结束阶段。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值