Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别

很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它。 这意味着在Java中使用WeakReference和SoftReference的位置和方法之间存在差距。 参考类对于垃圾收集的工作方式尤其重要。 众所周知,垃圾收集器从有资格进行垃圾收集的对象中回收内存,但是很少有程序员知道这种资格的确定取决于指向该对象的引用类型。 这也是Java中WeakReference和SoftReference之间的主要区别 。 如果只有弱引用指向该对象并且它会被急切地收集,则垃圾收集器可以收集该对象;另一方面,当JVM绝对需要内存时,将收集具有SoftReference的对象。 SoftReference和WeakReference的这些特殊行为使它们在某些情况下很有用,例如SoftReference在实现缓存方面看起来很完美,因此当JVM需要内存时,它会删除只有SoftReference指向它们的对象。 另一方面,WeakReference非常适合存储元数据,例如,存储ClassLoader引用。 如果没有加载任何类,则没有必要保留ClassLoader的引用,WeakReference会在删除最后一个强引用后立即使ClassLoader有资格进行垃圾回收。 在本文中,我们将探索有关Java中各种参考的更多信息,例如,强参考和幻影参考。

对于那些不知道的人,Java有四种参考:

  1. 强大的参考
  2. 参考不足
  3. 软参考
  4. 幻影参考

强引用是最简单的,因为我们在日常编程中使用它,例如在代码中,String s =“ abc”,引用变量s具有对String对象“ abc”的强引用。 任何附加了“强引用”的对象都不符合垃圾回收的条件 。 显然,这些是Java程序所需的对象。 弱引用使用java.lang.ref.WeakReference类表示,您可以使用以下代码创建弱引用:

Counter counter = new Counter(); // strong reference - line 1
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection

现在,只要您将强引用计数器设置为null,在第1行创建的计数器对象就可以进行垃圾回收; 因为它没有更多的“强引用”和“弱引用”(由引用变量“ weakCounter”引用)无法防止对Counter对象进行垃圾回收。 另一方面,如果这是“软引用”,则在JVM绝对需要内存之前,不会垃圾收集Counter对象。 Java中的软引用使用java.lang.ref.SoftReference类表示。 您可以使用以下代码在Java中创建SoftReference。

Counter prime = new Counter();  // prime holds a strong reference - line 2
SoftReference<Counter> soft = new SoftReference<Counter>(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory

在将强引用设为空之后,在第2行上创建的Counter对象仅具有一个软引用,该软引用不能阻止对其进行垃圾回收,但可以延迟收集,对于WeakReference来说这是急切的。 由于SoftReference和WeakReference之间的主要区别 ,SoftReference更适合于缓存,而WeakReference更适合于存储元数据 。 WeakReference的一个方便示例是WeakHashMap,它是Map接口的另一种实现,例如HashMap或TreeMap,但具有一个独特的功能。 WeakHashMap将键包装为WeakReference,这意味着一旦删除了对实际对象的强引用,WeakHashMap内部存在的WeakReference便不会阻止它们被垃圾收集。

幻象引用是java.lang.ref包中提供的第三种引用类型。 幻影引用由java.lang.ref.PhantomReference类表示。 只要垃圾收集器喜欢,便可以收集仅具有幻影引用指向它们的对象。 与WeakReference和SoftReference类似,您可以使用以下代码创建PhantomReference:

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference - line 3
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit); // phantom reference to object created at line 3digit = null;

删除“强引用”后,在第3行创建的DigitalCounter对象可以随时进行垃圾回收,因为它仅具有一个指向它的PhantomReference,这不能阻止它进行GC处理。

除了了解WeakReference,SoftReference,PhantomReference和WeakHashMap之外,还有一个名为ReferenceQueue的类值得一提。 您可以在创建任何WeakReference,SoftReference或PhantomReference时提供ReferenceQueue实例,如以下代码所示:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanupDigitalCounter digit = new DigitalCounter();
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue);

实例的引用将附加到ReferenceQueue,您可以通过轮询ReferenceQueue来使用它执行任何清理。 该图很好地总结了对象的生命周期。

Java中弱的强软幻影参考

这就是Java中WeakReference和SoftReference之间的区别 。 我们还学习了引用类的基础,例如Java和WeakHashMap和ReferenceQueue中的弱引用,软引用和幻像引用。 谨慎地使用引用可以帮助进行垃圾回收,并在Java中实现更好的内存管理。

翻译自: https://www.javacodegeeks.com/2014/03/difference-between-weakreference-vs-softreference-vs-phantomreference-vs-strong-reference-in-java.html

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

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

相关文章

Elasticsearch 深入3

分词器的内部组成到底是什么&#xff0c;以及内置分词器的介绍 1、什么是分词器 切分词语&#xff0c;normalization&#xff08;提升recall召回率&#xff09; 给你一段句子&#xff0c;然后将这段句子拆分成一个一个的单个的单词&#xff0c;同时对每个单词进行normalization…

[WC2014]时空穿梭(莫比乌斯反演)

https://www.cnblogs.com/CQzhangyu/p/7891363.html 不难推到$\sum\limits_{D1}^{m_1}\sum\limits_{d|D}C_{d-1}^{c-2}\mu(\frac D d)\prod\limits_{i1}^n\frac {(2m_i-({\lfloor \frac {m_i} {D} \rfloor}1)\times D){\lfloor \frac {m_i} {D} \rfloor}}{2}$。 $O(Tnm)$&#…

css设置字符长度,在css中设置最大字符长度

12 个答案:答案 0 :(得分&#xff1a;199)你总是可以通过设置max-width和溢出ellipsis来使用截断方法p {white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width: 200px;}对于多行截断&#xff0c;请查看flex解决方案。截断3行的示例。p {overflow: hidden;d…

一些sql 语句(行列转换等)

1. 行列转换--普通假设有张学生成绩表(CJ)如下Name Subject Result张三 语文 80张三 数学 90张三 物理 85李四 语文 85李四 数学 92李四 物理 82想变成 姓名 语文 数学 物理张三 80 90 85李四 85 92 82declare sql varchar(4000)set sql select Nameselect sql sql ,sum(cas…

关于html以及js相关格式验证的记录

验证的常见方式 我们在写前端的时候或多或少的会遇到一些验证格式问题&#xff0c;通常我们有三种解决办法。 第一种就是在输入完成后在输入框附近验证给出提示第二种就是在输入完成后在提交的时候排着验证提示第三张就是限制输入 前面两种我们都是非常的熟悉以及想到的&…

mysql重做日志_MySQL-重做日志 redo log -原理

【redo log buffer】【redo log file】-原理目录&#xff1a;1.重做日志写入过程图2.相关知识点汇总图3.redo_log_buffer 原理4.redo_log_file 原理1. 重做日志写入过程&#xff1a;2. 相关知识点汇总&#xff1a;3. redo log buffer 原理重做日志缓冲(redo log buffer)是Innod…

Java 8 Friday:使用Streams API时的10个细微错误

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…

孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1

孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1 &#xff08;完整学习过程屏幕记录视频地址在文末&#xff09; 感觉用requests获取到网页的html源代码后&#xff0c;更重要的工作其实是分析得到的内容&#xff0c;因此这时候大名鼎鼎的BeautifulSoup模块就可以大展…

如何将h5网页改成微信网页

1、如何将h5网页改成微信网页 1、设置安全域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 备注&#xff1a;登录后可在“开发者中心”查看对应的接口权限。 2、引用一个js文件 在微信开发者里面 js sdk里面 <sc…

AspNetForums中基于角色的权限控制

AspNetForums中基于角色的权限控制 http://blog.joycode.com/dotey/archive/2005/02/24/44791.aspxasp.net页面如何控制页面依据不同用户权限有不可见、可见、编辑 三种操作权限 http://community.csdn.net/Expert/topic/3436/3436974.xml?temp.0139429做过权限管理和想做权限…

c#a服务器上传文件b服务器,C#_c#批量上传图片到服务器示例分享,客户端代码: 复制代码 代码 - phpStudy...

c#批量上传图片到服务器示例分享客户端代码&#xff1a;/// /// 批量上传图片/// /// 服务器路径/// 图片文件夹路径/// 图片名称public void UpLoadFile(string srcurl, string imagesPath, List files){int count 1;foreach (string imageName in files){string name image…

mysql集群重启offline_mysql集群搭建问题及解决方法集锦

在上一篇博客中写了如何搭建mysql集群&#xff0c;之所以遇到这些问题&#xff0c;是因为刚开始弄mysql集群的时候不熟悉&#xff0c;正是因为这些问题&#xff0c;让我对mysql集群的了解渐渐深入&#xff0c;下面介绍在搭建mysql集群的时候我遇到了一些问题。1、mysql集群安装…

C - CJSON

cJSON API说明cJSON_Version()获得cJSON的版本cJSON_InitHooks();初始化cJSON_Hooks结构体cJSON_Parse();将字符串解析成cJSON结构体cJSON_ParseWithOpts()使用一些配置解析字符串cJSON_Print()将cJSON结构体转换成格式化的字符串cJSON_PrintUnformatted()将cJSON结构体转换成…

Java SE 8新功能导览:Java开发世界中的重大变化

与其他专业团队成员一样&#xff0c;我是采用OpenJDK的成员之一&#xff0c;但是从最近8个月开始加入&#xff0c;我们经历了Java SE 8 开发&#xff0c;编译&#xff0c;编码&#xff0c;讨论等各个阶段&#xff0c;直到将其付诸实践为止。 。 它于2014年3月18日发布&#xff…

蘑菇街一电话面试1

说说你常用的技术栈&#xff1f; ajax解决跨域问题的方法&#xff1f;jsonp的主要实现原理&#xff1f; 点击页面某个按钮&#xff0c;将原本一行显示的内容分成两行&#xff0c;如何实现&#xff1f; 怎样实现段首缩进&#xff1f;值是什么&#xff1f; 如何实现文本限制显示两…

从Java官网下载最新的文档(包含API文档)

Java学习资料(适合c转java的同学)&#xff1a; Java中带包&#xff08;创建及引用&#xff09;的类的编译 - 小明快点跑 JAVA 对象引用&#xff0c;以及对象赋值 - 飘来荡去。 Java官网下载页&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/index.html…

12121

sdfsfsfdsf转载于:https://www.cnblogs.com/zhongkeruanjian/archive/2006/06/01/414875.html

html option ajax,Ajax实现简单下拉选项效果【推荐】

基本都是固定步骤&#xff01;主要在JAVASCRIPT和PHP中的操作1、HTML代码里就只有两个SELECT标签如下&#xff1a;请选择请选择2、Javascript中进行创建选项和执行AJAX异步请求步骤如下var xhr getXhr();// 第一次执行Ajax异步请求 - 省份window.onload function(){xhr.open(…

svn安装教程 mysql_CentOS6.4 下安装SVN的详细教程(超详细)

1、检查系统是否已经安装如果安装就卸载rpm -qa subversionyum remove subversion2、安装yum install subversion3、建立SVN库mkdir -p /home/svn/repossvnadmin create /home/svn/repos执行上面的命令后&#xff0c;自动建立repositories库&#xff0c;查看/home/svn/repos 文…

babel安装

注意&#xff1a;如果没有装node.js&#xff0c;先去装一个&#xff01;&#xff01;安装node.js时会默认安装npm。 步骤&#xff1a; 1、新建一个文件夹&#xff0c;装接下来的所有东西。我新建了一个learn-es6文件夹 2、在learn-es6项目文件下创建根目录文件&#xff1a; …