有什么区别?java.lang.ref.WeakReference
java.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()
Widget
weakWidget.get()
null
…
软引用
软引用与
弱引用完全相同,只是它不太
渴望丢弃它所引用
的对象。
一个只能弱可访问的对象(对它的最强
引用是)
将在下一个垃圾
回收周期被丢弃,但一个软可访问的对象
通常会
保留一段时间。WeakReferences
SoftReferences
不需要与 的行为
有任何不同,但实际上,只要内存
充足,通常就会
保留可
轻访问的对象。这使它们成为缓存(例如
上述图像缓存)的
良好基础,
因为您可以让垃圾
回收器担心对象的可访问性
(强
可访问对象永远不会从缓存中删除
)以及它需要
它们消耗的内存的严重程度。WeakReferences
彼得·凯斯勒(Peter Kessler)在评论中补充说:
Sun JRE 对待软引用的方式与弱引用不同。如果可用内存没有压力,我们尝试保留 SoftReference 引用的对象。一个细节:“-client”和“-server”JRE 的策略是不同的:-client JRE 试图通过首选清除 SoftReferences 而不是扩展堆来保持较小的占用空间,而 -server JRE 试图通过首选扩展堆(如果可能)而不是清除 SoftReferences 来保持高性能。一种尺寸并不适合所有人。
网友回答:
在爪哇;从强到弱的顺序有:强、软、弱和幻影
强引用是保护引用对象不被 GC 收集的普通引用。即从不垃圾收集。
软引用符合垃圾回收器收集的条件,但在需要其内存之前可能不会收集。即垃圾收集之前.OutOfMemoryError
弱引用是不保护引用对象免受 GC 收集的引用。即垃圾收集当没有强或软引用时。
幻像引用是对对象的引用,在对象完成之后,但在回收其分配的内存之前,被幻中引用。
源
类比:假设一个JVM是一个王国,对象是王国的国王,GC是王国的攻击者,他试图杀死国王(对象)。
模板简介:该模板名称为【Java中的SoftReference和WeakReference有什么区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。