码迷,mamicode.com
首页 > 编程语言 > 详细

java基础-Reference二

时间:2017-07-29 18:13:00      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:变量   类变量   情况   条件   ges   queue   read   梳理   结束   

上一篇简单介绍了三种Reference的使用情况,这一篇就进入源码看一下,这里以WeakReference为例。
 
首先来看Reference的四种状态
active即活跃状态,表明该Reference的referent未被gc,其主要特点就是next==null;
pending即待处理状态,这里所说的待处理是指待HandlerThread处理,此状态表明referent已被gc,但Reference还需进一步处理(通常就是进入其注册队列);
enqueued即已入队,表明Reference已进入其注册的队列,主要特点就是queue==ReferenceQueue.ENQUEUED,出队后状态变为inactive;
inactive即非活跃状态,表明不会再被进行任何处理,出队或经过HandlerThread处理但未注册队列就会变为inactive。
 
技术分享

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

技术分享

 

来简单梳理一下,gc面对SoftReference、WeakReference、PhantomReference对象实例会特殊对待,如果其状态为active(next==null)且不满足回收条件则加入由gc维护的一个discovered链表,如果满足回收条件,则对referent进行回收(SoftReference还需内存紧张的条件),并将Reference加入pending链表(该链表由Reference类维护,即类变量pending)。gc结束后会唤醒HandlerThread,HandlerThread会遍历pending链表,如果节点Reference是Cleaner则执行clean逻辑不入队,如果不是Cleaner,且注册有队列,则入队。

java基础-Reference二

标签:变量   类变量   情况   条件   ges   queue   read   梳理   结束   

原文地址:http://www.cnblogs.com/holoyong/p/7256860.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!