WeakReference reference quene GC

 

在了解WeakReference之前,先给出一段简单的代码:

public class WeakReferenceTest {
public static void main(String[] args) throws Exception {
Object o = new Object();
// 默认的构造函数,会使用ReferenceQueue.NULL 作为queue
WeakReference<Object> wr = new WeakReference<Object>(o);
System.out.println(wr.get() == null);
o = null;
System.gc();
System.out.println(wr.get() == null);
}
}
输出结果:false,true

 

喜欢探求究竟的童鞋会问,为啥System.gcWeakReference马上会被回收,怎么做到的呢?让我们一起来深入Reference的源码探求个究竟.内部有两点需要注意:

1)pending和 discovered成员:

先看:pending对象

/* List of References waiting to be enqueued.  The collector adds
* References to this list, while the Reference-handler thread removes
* them. This list is protected by the above lock object.
*/
private static Reference pending = null;
这个对象,定义为private,并且全局没有任何给它赋值的地方,根据它上面的注释,我们了解到这个变量是和垃圾回收期打交道的

再看discovered,同样为private,上下文也没有任何地方使用它

transient private Reference<T> discovered;    /* used by VM */

看到了它的注释也明确写着是给VM用的。

 

    上面两个变量对应在VM中的调用,可以参考openjdk中的hotspot源码,在hotspot/src/share/vm/memory/referenceProcessor.cpp 的ReferenceProcessor::discover_reference 方法。(根据此方法的注释由了解到虚拟机在对Reference的处理有ReferenceBasedDiscovery和RefeferentBasedDiscovery两种策略)

 

2)ReferenceHandler 线程

这个线程在Reference类的static构造块中启动,并且被设置为高优先级和daemon状态。

此线程要做的事情,是不断的检查pending 是否为null,如果pending不为null,则将pending进行enqueue,否则线程进入wait状态。

通过这2点,我们来看整个过程:

pending是由jvm来赋值的,当Reference内部的referent对象的可达状态改变时,jvm会将Reference对象放入pending链表。

结合代码eg1中的 o = null; 这一句,它使得o对象满足垃圾回收的条件,并且在后边显式的调用了 System.gc(),垃圾收集进行的时候会标记WeakReference所referent的对象o为不可达(使得wr.get()==null),并且通过 赋值给pending ,触发ReferenceHandler线程处理pending。

 

ReferenceHandler线程要做的是将pending对象enqueue,但默认我们所提供的queue,也就是从构造函数传入的是null,实际是使用了ReferenceQueue.NULL,Handler线程判断queue为ReferenceQueue.NULL则不进行操作,只有非ReferenceQueue.NULL 的queue才会将Reference进行enqueue。

 

ReferenceQueue.NULL相当于我们提供了一个空的Queue去监听垃圾回收器给我们的反馈(什么反馈呢?是说这个quene是给我们来用的么,例如WeakHashMap中使用的那种方式),并且对这种反馈不做任何处理。(但垃圾还是回收了???不是poll时候做的事情么?)

要处理反馈,则必须要提供一个非ReferenceQueue.NULL的queue。这个quene可以看做是GC与应用程序的一个桥梁,告知应用需要对那些reference进行处理.

 

当一个 WeakReference 开始返回 null 时, 它所指向的对象已经准备被回收, 这时可以做一些合适的清理工作.   将一个 ReferenceQueue 传给一个 Reference 的构造函数, 当对象被回收时, 虚拟机会自动将这个对象插入到 ReferenceQueue 中, WeakHashMap 就是利用 ReferenceQueue 来清除 key 已经没有强引用的 entries.

 

 

在WeakHashMap则在内部提供了一个非NULL的ReferenceQueue

    private final ReferenceQueue<K> queue = new ReferenceQueue<K>();

在 WeakHashMap 添加一个元素时,会使用 此queue来做监听器。

 

见put方法中的下面一句:

tab[i] = new Entry<K,V>(k, value, queue, h, e);
这里Entry是一个内部类,继承了WeakReference
class Entry<K,V> extends WeakReference<K> implements Map.Entry<K,V>
WeakHashMap的 put, size, clear 都会间接或直接的调用到 expungeStaleEntries()方法。

 

顾名思义,此方法的作用就是将 queue中陈旧的Reference进行删除,因为其内部的referent都已经不可达了。所以也将这个WeakReference包装的key从map中删除。

 

总结:ReferenceQueue是作为 JVM GC与上层Reference对象管理之间的一个消息传递方式,它使得我们可以对所监听的对象引用可达发生变化时做一些处理,WeakHashMap正是利用此来实现的。

 

用图来大致表示如下:

r_1441936_1294108556Yl4g.png

转载于:https://www.cnblogs.com/redcreen/archive/2011/02/15/1955228.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北大4位数学天才,如今齐聚美国搞科研,令人叹息

全世界只有3.14 % 的人关注了爆炸吧知识最近这些年&#xff0c;计算机、电子产业异军突起&#xff0c;人工智能越来越受到追捧和重视&#xff0c;电子产品智能化已经成为发展的一种潮流和趋势。与此同时&#xff0c;国际竞争也日益激烈&#xff0c;这种竞争归根结底还是人才的竞…

为什么 Dapr 如此令人兴奋

如今你构建软件&#xff0c;您可以从数量众多的云服务中进行选择。仅 AWS 就每个月都在不断为其200多项服务添加新服务&#xff0c;而其他云提供商也都在跟上。如果您的公司想与您的竞争对手竞争&#xff0c;您就需要充分利用这些服务&#xff0c;这些服务在不同的云提供商都有…

java对象头_我的并发编程(二):java对象头以及synchronized升级过程

一、概述研究java对象头的目的是详细分析Java的synchronized锁的升级过程&#xff0c;因为synchronized在锁升级的时候&#xff0c;就是依赖对象头的信息来决定的。本博文针对64位的操作系统来对Java对象头进行详解。二、详细分析1. 用户态与内核态内核态与用户态是操作系统的两…

【转】Beagleboard:BeagleBoneBlack

原文网址&#xff1a;http://elinux.org/Beagleboard:BeagleBoneBlack Did you know that elinux.org has Mailing Lists? Please feel free to register today to discuss the wiki in general, request features, etc. etc.. Thanks!--Wmat (talk) Beagleboard:BeagleBoneBl…

剖析IE浏览器子系统的性能权重

来源于InfoQ&#xff1a; 微软IE开发团队性能主管Jason Weber在一篇博 文中介绍了IE浏览器的各个子系统&#xff0c;并通过实验数据展示了不同网站对浏览器子系统的性能影响和权重&#xff0c;InfoQ中文站对相关内容做了整理&#xff0c;希望对 浏览器开发人员和Web应用开发人员…

每年通过率仅1%的“天才考试”,中国到底应不应该学?

▲ 点击查看说起世界上最顶尖的基础教育&#xff0c;新加坡绝对能占一席之地。香港首富李嘉诚是这么评价新加坡教育的&#xff1a;“新加坡采用的教育体系源于英国传统的教育制度&#xff0c;它的私立、私立教育院校及一流大学和国际教育机构全球卓越。”李嘉诚甚至在长孙还没多…

C# VS生成后事件命令行

“ 引言部分&#xff0c;总领全篇文章的中心内容。”01—前言Visual Studio中&#xff0c;可以在项目-》属性-》生成事件-》生成后事件命令行&#xff08;O&#xff09;:中设置项目生成后执行的脚本&#xff0c;从而实现项目文件生产后的自动部署。如下图所示&#xff1a;02—自…

mysql binlog 大数据_后起之秀 | MySQL Binlog增量同步工具go-mysql-transfer实现详解

一、 概述工作需要研究了下阿里开源的MySQL Binlog增量订阅消费组件canal&#xff0c;其功能强大、运行稳定&#xff0c;但是有些方面不是太符合需求&#xff0c;主要有如下三点&#xff1a;需要自己编写客户端来消费canal解析到的数据server-client模式&#xff0c;需要同时部…

如何备份服务器日志到其他服务器_KIWI Syslog日志服务器搭建及配置

认地&#xff0c;kiwi使用UDP 514端口接收日志数据&#xff0c;安装成功后即可接收日志使用命令netstat –ano查看服务器监听状态&#xff0c;如果服务没起来&#xff0c;则重新启动服务Kiwi Syslog Daemon任务&#xff1a;把当天的日志保存在G:event&#xff0c;历史日志保存在…

Dapr牵手.NET学习笔记:状态管理进阶(二)

为了防止并发对数据修改造成差异&#xff0c;dapr使用了etag标签来作为版本号&#xff0c;对数据修改进行验证。下面是对etag的一个demoappsettings.json中的url配置"StateUrl": "http://localhost:3500/v1.0/state/statestore"在PaymentSystem项目中添加两…

这三位同学的名字绝了!笑得肚子疼......

1 这三位同学的名字绝了&#xff01;▼2 我是一只小海豹我在假装跷跷板▼3 单身狗受到暴击▼4 小宝宝真可怜打针打出了条件反射▼5 每生成一个验证码都有一位程序员......▼6 虽然腿短但是人家跑得快啊▼7 内容引起极度舒适▼你点的每个赞&#xff0c;我都认真当成了喜欢…

从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)

从hadoop框架与MapReduce模式中谈海量数据处理前言几周前&#xff0c;当我最初听到&#xff0c;以致后来初次接触Hadoop与MapReduce这两个东西&#xff0c;我便稍显兴奋&#xff0c;认为它们非常是神奇&#xff0c;而神奇的东西常能勾起我的兴趣&#xff0c;在看过介绍它们的文…

WPF过渡面板

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 前言效果投稿来源于-郑竣僖 QQ&#xff1a;41130958301—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;一、Tra…

UScript中的Pow函数

这些天越来越发现数学的重要和妙趣了&#xff0c; 由于一些地方需要使用指数次幂来实现更好的效果&#xff0c; 想当然地去找pow函数&#xff0c;把Object和Actor翻了个底朝天 。。。 结果可想而知&#xff0c; 也正好&#xff0c;尝试了一把UScript和C的混编&#xff0c;但搜一…

哪些才是对女朋友的有效关心,来学习一下~

1 这本书真好&#xff0c;在哪里才能买得到呢&#xff1f;2 求求你&#xff0c;不要抢我的小毛虫&#xff01;3 所有的乘客请系好安全带4 小朋友非常可爱了5 字幕组真的尽力了&#xff01;6 学习了7 10月16日&#xff0c;平安南京 根据真实接警经历&#xff0c;发布一则警示案例…

fabric 转账_Fabric 学习笔记-架构初探

本文介绍了Fabric的架构&#xff0c;以及通过一个简单的Demo来熟悉整个交易流程。Hyperledger fabric V1.0的架构如下图所示&#xff1a;application提供各种语言的SDK接口。membership也就是fabric-ca提供成员服务&#xff0c;用来管理身份&#xff0c;提供授权和认证。peer负…

多个goruntine 性能变慢_提高 JavaScript 性能的 12 个技巧

作者丨Liz Parody在创建 Web 应用程序时应始终考虑性能。为了帮助你开始&#xff0c;本文列举了有效提高应用程序性能的 12 种方法。性能是创建网页或应用程序时最重要的一个方面。没有人想要应用程序崩溃或者网页无法加载&#xff0c;或者用户的等待时间很长。根据 Kissmetric…

#celery#周期性任务

2019独角兽企业重金招聘Python工程师标准>>> 玩了一个星期的clannad&#xff0c;是时候干点事了。 折腾了下celery周期性任务&#xff1a; celery提供了一个叫celery beat的服务&#xff0c;用于定时驱使worker执行任务。也就是说&#xff0c;如果本地没有活动的wor…

WTMPlus 1.1 发布

点击上方蓝字关注我们1.1版本WTMPlus上线一个多月以来&#xff0c;得到了越来越多用户的喜爱。虽然1.0版本还有不少问题&#xff0c;但是它的核心理念和功能受到了用户的认可。1.1版本修复了大量用户反馈的易用性的问题和系统Bug&#xff0c;并且加入了强悍的图表工具。图表编辑…

4部“教材级”纪录片,有生之年必看系列!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片是以真实生活为创作素材&#xff0c;以真人真事为表现对象&#xff0c;并对其进行艺术的加工与展现的&#xff0c;以展现真实为本质&#xff0c;并用真实引发人们思考的电影或电视艺术形式。好的纪录片就像打开了一扇新世界的大门&…