首页 > Java > Java中的SoftReference和WeakReference有什么区别?

Java中的SoftReference和WeakReference有什么区别?

上一篇 下一篇

有什么区别?java.lang.ref.WeakReferencejava.lang.ref.SoftReference

分割线

网友回答:

急切地收集弱参考文献。如果 GC 发现某个对象是
弱可访问的(只能通过弱引用访问),它将立即清除对该对象的
弱引用。因此,它们适用于
保留对对象的引用,程序还保留
(强引用)“相关信息”,例如有关类的缓存
反射信息或对象的包装器等。
任何在与其关联的
对象之后保留没有意义的内容都是 GC-ed。当弱引用被清除时,它会在代码在某处轮询的
引用队列中排队,并且还会丢弃
关联的对象。也就是说,您可以保留有关
对象的额外信息,但是一旦它引用
的对象消失,就不需要该信息。实际上,在某些情况下,您甚至可以对弱引用进行子类化,并将有关对象的
相关额外信息保留在弱引用子类
的字段中。WeakReference 的另一个
典型用途是与 Maps 结合使用以保留规范实例。

另一方面,软引用适用于缓存外部可重新创建的资源
,因为 GC 通常会延迟清除它们。可以保证的是,在抛出 OutOfMemoryError 之前,所有
软引用都会被清除,因此理论上它们
不会导致 OOME[*]。

典型的用例示例是保留
文件中内容的解析形式。您将实现一个系统,在其中加载文件,解析它,并保留
对已解析表示的根对象的 Soft引用。下次需要该文件时
,您将尝试通过软引用检索它。如果可以检索它,则可以省去另一个加载/解析,如果GC在此期间
清除了它,则可以
重新加载它。这样,您就可以利用可用
内存进行性能优化,但不会冒 OOME 的风险。

现在是 [*]。保留软引用本身不会导致 OOME。另一方面,如果您错误地将 SoftReference 用于旨在使用 WeakReference
的任务(即,您以某种方式
保留与对象相关的信息,并在清除引用对象
时丢弃它),您可能会
遇到 OOME,因为轮询 ReferenceQueue
并丢弃关联对象的代码可能碰巧没有及时
运行。

因此,决策取决于使用情况
– 如果您缓存的信息构造成本很高,但
仍然可以从其他数据重建,请使用软引用 – 如果您要保留对某些数据的规范实例的引用,或者
您希望在不“拥有”对象的情况下引用它(从而
防止它被GC’d),请使用弱引用

分割线

网友回答:

摘自伊桑·尼古拉斯(Ethan Nicholas)的《理解弱引用》(Understanding Weak References):

弱引用

简单地说,引用是指不足以
强制对象保留在内存中的
引用。
弱引用允许您利用
垃圾回收器的功能来确定
您的可访问性,因此您
不必自己执行此操作。您可以
创建一个弱引用,如下所示:

WeakReference weakWidget = new WeakReference(widget);

然后在
代码中的其他位置,您可以使用它来
获取实际
对象。当然,弱
引用不足以
阻止垃圾回收,因此您可能会
发现(如果没有对小部件的强
引用)突然
开始
返回。
weakWidget.get()WidgetweakWidget.get()null

软引用

软引用
弱引用完全相同,只是它不太
渴望丢弃它所引用
的对象。
一个只能弱可访问的对象(对它的最强
引用是)
将在下一个垃圾
回收周期被丢弃,但一个软可访问的对象
通常会
保留一段时间。
WeakReferences

SoftReferences
不需要与 的行为
有任何不同,但实际上,只要内存
充足,通常就会
保留可
轻访问的对象。这使它们成为缓存(例如
上述图像缓存)的
良好基础,
因为您可以让垃圾
回收器担心对象的可访问性
(强
可访问对象永远不会从缓存中删除
)以及它需要
它们消耗的内存的严重程度。
WeakReferences

彼得·凯斯勒(Peter Kessler)在评论中补充说:

Sun JRE 对待软引用的方式与弱引用不同。如果可用内存没有压力,我们尝试保留 SoftReference 引用的对象。一个细节:“-client”和“-server”JRE 的策略是不同的:-client JRE 试图通过首选清除 SoftReferences 而不是扩展堆来保持较小的占用空间,而 -server JRE 试图通过首选扩展堆(如果可能)而不是清除 SoftReferences 来保持高性能。一种尺寸并不适合所有人。

分割线

网友回答:

在爪哇;从强到弱的顺序有:强、软、弱和幻影

强引用是保护引用对象不被 GC 收集的普通引用。即从不垃圾收集。

软引用符合垃圾回收器收集的条件,但在需要其内存之前可能不会收集。即垃圾收集之前.OutOfMemoryError

弱引用是不保护引用对象免受 GC 收集的引用。即垃圾收集当没有强或软引用时。

幻像引用是对对象的引用,在对象完成之后,但在回收其分配的内存之前,被幻中引用。

类比:假设一个JVM是一个王国,对象是王国的国王,GC是王国的攻击者,他试图杀死国王(对象)。

  • 国王强大时,GC无法杀死他。
  • 当国王软时,GC攻击他,但国王在保护下统治王国,直到资源可用。
  • 当国王软弱时,GC攻击他,但在没有保护的情况下统治王国。
  • 当国王是幻影时,GC已经杀死了他,但国王可以通过他的灵魂获得。

模板简介:该模板名称为【Java中的SoftReference和WeakReference有什么区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 220次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-20
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
html5 微信素材 响应式 微信模板 微信文章 微信公众平台 微信图片 自适应 企业网站 单页式简历模板
您可能会喜欢的其他模板