资讯详情

java - 弱引用是否有实际用途?

java - 弱引用有实际用途吗?

可能重复:

弱参考 - 它们有多有用?

由于垃圾收集器可以随时声明弱引用,是否有任何实际理由使用它们?

9个解决方案

44 votes

如果你想保留引用某些东西,只要它在其他地方使用,比如 监听器,你就可以使用弱引用。

WeakHashMap短期缓存可用作衍生数据的密钥。它还可以用来保存其他对象的信息,你不知道什么时候丢弃它们。

BTW Soft References就像弱引用一样,但并不总是立即清理。GC将始终丢弃弱引用,并尽可能保留软引用。

还有一种参考,叫做幻影参考。这是用来做的GC清理过程是指对象无法正常访问";正常"; 代码,因为它在清理过程中。

Peter Lawrey answered 2019-08-12T07:09:56Z

28 votes

由于垃圾收集器可以随时声称弱引用,是否有实际理由使用?

当然,使用它有实际原因。如果框架设计师以巨大的成本建立一个不切实际的弱参考系统,你会怎么想?

我认为你想问的问题是:

弱引用的现实是什么?

有很多。实现性能目标是很常见的。在调整应用程序的性能时,通常必须在更多的内存和更多的时间之间进行权衡。假设有一个复杂的计算,你必须执行多次,但计算是纯粹的"; - 的答案只取决于论据,而不取决于外部状态。你可以建立一个从参数到结果的映射 - ,但然后使用内存。你可能永远不会再问这个问题,然后浪费内存。

弱引用可能会解决这个问题; 缓存可能会变得非常大,所以如果你多次问同样的问题,它会节省时间。但如果缓存足够大,垃圾收集器需要回收空间,它可以安全地进行。

当然,缺点是垃圾收集器的清洁策略被调整为满足整个系统的目标,而不是具体的缓存问题。GC策略和所需的缓存策略充分对齐,那么弱引用是解决此问题的高度实用的解决方案。

Eric Lippert answered 2019-08-12T07:11:05Z

13 votes

如果WeakReference它是对象的唯一引用,如果你想让对象挂起来,应该使用SoftReference。

WeakReferences最适合有对象的其他引用,但不能(或不想)检测何时不使用其他引用。然后,另一个引用将防止对象被垃圾收集,而WeakReference这只是获得相同对象的另一种方式。

两种常用例:

用于保存您无法直接修改的特定对象的额外信息(通常是昂贵的计算,但可以重现),以及您无法控制其生命周期的信息。WeakHashMap保存这些引用的完美方法:WeakHashMap键只是保存弱,所以当密钥被垃圾收集时,值也可以从Map因此被垃圾收集而被删除。

用于实现事件或通知系统,包括";观众"; 在一些协调员处注册,以便在发生事件时通知他们 - ,但如果你不想阻止这些观众在他们生命的尽头被垃圾收集。WeakReference将对象指向,但仍处于活动状态,但指向"; null"; 一旦原始对象被垃圾收集。

Bill Michell answered 2019-08-12T07:12:02Z

12 votes

出于这个原因,我们使用它 - 在我们的例子中,我们有各种监听器必须注册服务。该服务保持了对侦听器的弱引用,而实例类保持了强引用。如果这些类别随时都有GC,所以弱引用是观众的剩余部分,然后是GC。它使跟踪中间类更容易。

Noah answered 2019-08-12T07:12:27Z

8 votes

最常用的弱引用方法是"; lookup";中值。

使用普通(硬)值引用时,如果地图中的值不再在其他地方引用,则通常不再需要搜索。对于弱引用的映射值,一旦没有其他引用,对象将成为垃圾收集的候选人

地图本身的引用(唯一)对象不会阻止它被垃圾收集,因为引用是弱引用

Bohemian answered 2019-08-12T07:13:06Z

3 votes

为防止内存泄漏,请参阅本文以获取详细信息。

óscar López answered 2019-08-12T07:13:30Z

3 votes

弱引用是一种引用,不保护引用对象不被垃圾收集器收集。

考虑到只有弱引用引用的对象无法到达(或";弱可达";)所以可以在任何地方收集时间。

弱引用用于避免不需要保留引用的内存。一些垃圾收集语言的功能或支持各级弱引用,如Java,C#,Python,Perl或Lisp的。

垃圾收集用于减少内存泄漏的可能性和数据损坏。垃圾收集有两种主要类型:跟踪和引用计数。参考计数方案记录了对给定对象的引用数,当收集对象的引用计数变为零时。由于只有一个对象一次收集,因此参考计数不能收集循环(或循环)引用。因此,相互引用的对象组不能直接被其他对象引用,也不能访问永久居住; 如果应用程序继续产生如此不可访问的对象组内存泄漏的影响。如果避免参考循环,则可以使用弱引用来解决问题。

弱引用也用于通过允许程序最小化不必要的数量来指示内存中哪些对象的对象并不重要。

Bhushan answered 2019-08-12T07:14:30Z

2 votes

我通常将它用于某种类型的缓存。最近访问的项目立即可用,如果缓存未命中,则重新加载项目(DB,FS,等等)。

Jan Zyka answered 2019-08-12T07:14:57Z

0 votes

我使用WeakSet编码图表中的链接。如果删除节点,链接将自动消失。

Neil G answered 2019-08-12T07:15:26Z

标签: 英国michell露点变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台