java中的softreference_Java中的SoftReference和WeakReference有什么区别?
问题
Java中的SoftReference和WeakReference有什么区别?它们有什么不同?
#1 热门回答(806 赞)
弱引用弱引用,简单地说,是一个不足以强制对象保留在内存中的引用。弱引用允许你利用垃圾收集器为你确定可达性的能力,因此你不必自己执行此操作。你创建一个像这样的弱引用:WeakReference weakWidget = new WeakReference(widget);
然后在代码的其他地方你可以使用weakWidget.get()来获取实际的Widget对象。当然,弱引用不足以阻止垃圾收集,因此你可能会发现(如果没有对小部件的强引用)weakWidget.get()突然开始返回null。 ...软引用软引用与弱引用完全相同,只是它不太愿意丢弃它引用的对象。一个只能弱到达的对象(对它的最强引用是WeakReferences)将在下一个垃圾收集周期被丢弃,但是一个可以轻松到达的对象通常会暂停一段时间。 SoftReferences的行为不需要与WeakReferences有任何不同,但实际上,只要内存供应充足,就可以保留软可访问对象。这使得它们成为缓存的良好基础,例如上面描述的图像缓存,因为你可以让垃圾收集器担心对象的可达性(永远不会从缓存中移除强可达对象)以及它有多糟糕需要他们消耗的记忆。
Sun JRE确实以不同于WeakReferences的方式处理SoftReferences。如果可用内存没有压力,我们会尝试保持SoftReference引用的对象。一个细节:“-client”和“-server”JRE的策略是不同的:-client JRE试图通过清除SoftReferences而不是扩展堆来保持你的足迹小,而-server JRE尝试保留你的通过优先扩展堆(如果可能)而不是清除SoftReferences来提高性能。一种尺寸并不适合所有人。
#2 热门回答(183 赞)
急切地收集弱引用。如果GC发现某个对象是弱可达的(只能通过弱引用访问),它将立即清除对该对象的弱引用。因此,它们有助于保持对程序也保留(强烈引用)“关联信息”的对象的引用,例如关于类的缓存反射信息,或对象的包装器等。任何使得在它与之关联的对象之后保持不变是GC-ed。当弱引用被清除时,它会在代码轮询某个地方的引用队列中排队,并且它也会丢弃关联的对象。也就是说,你保留有关对象的额外信息,但一旦它引用的对象消失,就不需要该信息。实际上,在某些情况下,你甚至可以继承WeakReference,并在WeakReference子类的字段中保留有关该对象的相关额外信息。 WeakReference的另一个典型用法是与Maps一起保存规范实例。
另一方面,SoftReferences适用于缓存外部可再生资源,因为GC通常会延迟清除它们。虽然在抛出OutOfMemoryError之前所有SoftReferences都会被清除,但是理论上它们不会导致OOME [*]。
典型的用例示例是从文件中保留已解析形式的内容。你将实现一个系统,你可以在其中加载文件,解析文件,并将SoftReference保留在已解析表示的根对象中。下次需要该文件时,你将尝试通过SoftReference检索它。如果你可以检索它,你可以节省自己的另一个加载/解析,如果GC在此期间清除它,你重新加载它。这样,你可以利用可用内存进行性能优化,但不要冒OOME风险。
现在为[*]。保持SoftReference本身不会导致OOME。另一方面,如果你错误地将SoftReference用于任务,则应使用WeakReference(即,你以某种方式强烈引用与Object关联的信息,并在Reference对象被清除时丢弃它),你可以运行到OOME中轮询ReferenceQueue并丢弃关联对象的代码可能不会及时运行。
因此,决定取决于使用情况 - 如果你正在缓存构造成本高昂的信息,但仍然可以从其他数据重建,请使用软引用 - 如果你要保留对某些数据的规范实例的引用,或者你希望引用一个没有“拥有”它的对象(从而防止它被GC化),使用弱引用。
#3 热门回答(97 赞)
在Java中;从最强到最弱的顺序,有:强,软,弱和幻影
A强引用是一个普通引用,它通过GC保护引用对象不被集合。即从不垃圾收集。
A软参考符合垃圾收集器的收集条件,但在需要内存之前可能不会收集。即垃圾收集在'OutOfMemoryError`之前。
A弱引用是一个引用,它不保护引用的对象不被GC收集。即没有强力或软质参考时垃圾收集。
A幻像引用是一个对象的引用,它在完成后被引用,但在其已分配的内存被回收之前被引用。
**类比:**假设JVM是一个王国,物体是王国的王者,GC是试图杀死国王(物体)的王国的攻击者。
当King强者时,GC无法杀死他。
当King为Soft时,GC会攻击他,但King会保护王国,直到有资源可用。
当King为弱者时,GC会攻击他,但在没有保护的情况下统治王国。
当国王是幻影时,GC已经杀死了他,但国王可以通过他的灵魂获得。
java中的softreference_Java中的SoftReference和WeakReference有什么区别?相关推荐
- Java中的SoftReference和WeakReference有什么区别?
本文翻译自:What's the difference between SoftReference and WeakReference in Java? java.lang.ref.WeakRefer ...
- java中的softreference_Java中的 WeakReference 和 SoftReference
我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...
- java中的softreference_Java中内存优化的SoftReference 和 WeakReference浅析
一.引用对象类型定义 首先,引用对象在Java定义中有三种类型,从弱到强依次为:软引用.弱引用与虚引用,三种级别也各有所不同(软引用>弱引用).本文浅析下软引用与弱引用.大概的解释,软引用适合应 ...
- Java 引用分类:StrongReference、SoftReference、WeakReference、PhantomReference
一,定义 在Java中,引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用.后面在JDK1.2开始,引用的概念被扩充,引用被分为强引用( ...
- java system.runfinalization()_Android中缓存理解(一)
Java GarbageCollection(GC) Java不能像C/C++那样直接对内存进行操作(内存分配和垃圾回收). 由于JVM会自动回收(GC),Java程序员很难控制JVM的内存回收,只能 ...
- java softreference_Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference...
Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...
- java super是引用变量吗_Java中super的几种用法并与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...
- java string 占位符_驳《阿里「Java开发手册」中的1个bug》?
前两天写了一篇关于<阿里Java开发手册中的 1 个bug>的文章,评论区有点炸锅了,基本分为两派,支持老王的和质疑老王的. 首先来说,无论是那一方,我都真诚的感谢你们.特别是「二师兄」, ...
- java中super用来定义父类,Java中super的几种用法及与this的区别
综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...
最新文章
- 吴恩达老师机器学习和深度学习课程文字版下载
- 原 CNCF 执行董事 Dan Kohn 辞世,沉痛哀悼
- 9于word没有注册类_XPage系列这次升级后终于是全自动化注册了!
- android中ScrollView嵌套ListView或GridView显示位置问题
- Pytorch基础(四)—— 卷积层
- 【计算机算法设计与分析】——栈和队列
- python设计模式17-中介者模式
- (47)网页布局常用工具
- 环回测试能够提供什么信息_VIAVI | 全面对比“真双向分析”与“环回测试”,结果一目了然!...
- 进程的调度策略与进程的状态
- 斯坦福博弈论笔记整理活动的任务已重新划分,望周知
- Web开发——PHP vs Java
- Brush、Color、String相互转换
- XML学习总结(一)——XML介绍
- JavaWeb请求的重定向与转发:getRequestDispatcher()的forward方法,sendRedirect方法,以及重定向与转发的区别
- android plaid,Plaid 开源库学习
- 2021福州金桥学校高考成绩查询,2021年福建高考成绩排名及成绩公布时间什么时候出来...
- Win 11 添加并使用 DOH
- opengl 画椭圆_椭圆围城与圆型观光步道
- 02 C语言使用队列实现缓存模块QueueBuffer
热门文章
- python中socket实现代理功能_python实现代理服务功能实例
- 3000字详解Pandas数据查询,建议收藏
- Node.js 环境下的 console.log 是同步执行的
- SAP UI5 应用的中文乱码问题
- Graph QL和SAP Graph的区别
- SAP Spartacus b2b表格的cell配置解析逻辑
- JSP的生命周期研究
- 使用nodejs应用查询SAP HANA Express Edition里的数据
- 推荐一个好用的Chrome扩展,专门处理xml的,名叫XML Tree
- click Edit button in Opportunity - why curr is displayed wrongly