对于弱引用有实际用途吗?

可能重复:
弱引用 - 它们有多有用?

由于垃圾收集器可以随时声明弱引用,因此使用它们有什么实际的理由吗?


如果只要在其他地方(例如Listener)使用某个引用,就可以使用弱引用。

WeakHashMap可以用作派生数据的密钥的短暂缓存。 它也可以用来保存有关使用的对象的信息,而不知道何时抛弃这些对象。

BTW软引用就像弱引用,但它们不会总是立即清除。 GC会一直放弃弱参考,并在可能时保留软参考。

还有一种称为幻影参考的参考。 这用于GC清理过程,指的是“正常”代码无法访问的对象,因为它正在清理过程中。


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

当然,有实际的理由来使用它。 如果框架设计师花费巨大的代价去建立一个不切实际的弱参考系统,那你会觉得奇怪吗?

我想你想问的问题是:

什么是人们使用弱引用的现实情况?

有许多。 常见的一个是实现绩效目标。 当调整应用程序的性能时,通常必须在更多的内存使用和更多的时间使用之间进行权衡。 假设例如有一个复杂的计算,你必须执行很多次,但是计算是“纯粹的” - 答案只取决于参数,而不取决于外生状态。 你可以构建一个缓存 - 一个从参数到结果的映射 - 但是它使用内存。 你可能再也不会问这个问题了,那么记忆就会被浪费掉。

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

不利的一面是垃圾收集器的清理策略被调整为满足整个系统的目标,而不是您特定的缓存问题。 如果GC政策和您期望的高速缓存策略足够一致,那么弱引用是解决此问题的高度实用的解决方案。


如果WeakReference是对象的唯一引用,并且您希望该对象处于悬停状态,则应该使用SoftReference来代替。

WeakReference最适用于那些会有其他对象引用的情况,但不能(或不想)必须检测何时不再使用这些其他引用。 然后,另一个引用将防止垃圾收集对象,并且WeakReference只是获取同一对象的另一种方式。

两种常见的用例是:

  • 为了保存关于特定对象的附加(通常是昂贵计算但可重现的)信息,而这些信息不能直接修改,并且您的生命周期几乎无法控制。 WeakHashMap是持有这些引用的完美方式:WeakHashMap中的关键字只是弱地保留,所以当密钥被垃圾收集时,该值也可以从Map中删除,因此被垃圾收集。
  • 为了实施某种事件或通知系统,“听众”在某种协调员身上进行注册,这样他们可以在事情发生时得到通知 - 但是当你不想阻止这些听众在他们来到时收集垃圾他们生命的尽头。 一个WeakReference会在它仍然活着的时候指向这个对象,但是一旦原始对象被垃圾收集,它就指向“null”。
  • 链接地址: http://www.djcxy.com/p/72771.html

    上一篇: Is there a practical use for weak references?

    下一篇: Cost of using weak references in Java