一尘不染

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

java

java.lang.ref.WeakReference和之间有什么区别java.lang.ref.SoftReference?


阅读 990

收藏
2020-03-06

共1个答案

一尘不染

从Ethan Nicholas的《理解弱引用》中:

参考不足

一个弱引用,简单地说,是不是强大到足以迫使对象保留在内存中的参考。弱引用使您可以利用垃圾收集器的能力来确定您的可达性,因此您不必自己做。您创建像这样的弱引用:

WeakReference weakWidget = new WeakReference(widget);

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

软参考

甲软参考酷似弱引用,不同之处在于它是更少急于扔掉其所引用的对象。只有弱可达性的对象(对其最强的引用是WeakReferences)将在下一个垃圾回收周期中被丢弃,但是柔弱可达性的对象通常会停留一段时间。

SoftReferences并不需要向任何行为不同于 WeakReferences,但在实践中轻轻地可达对象一般保留,只要内存供应充足。这使它们成为缓存(例如上述图像缓存)的良好基础,因为您可以让垃圾收集器担心对象的可访问性(一个高度可访问的对象将永远不会从缓存中删除)。需要他们正在消耗的内存。

彼得·凯斯勒(Peter Kessler)在评论中添加:

Sun JRE确实将SoftReferenceWeakReferences区别对待。如果可用内存没有压力,我们尝试保留由SoftReference引用的对象。一个细节:“-client”和“ -server” JRE的策略不同:-client JRE倾向于通过清除SoftReferences而不是扩展堆来减小占用的空间,而-server JRE尝试保持您的占用空间。通过扩大堆(如果可能)而不是清除SoftReferences,可以提高性能。一种尺寸并不适合所有尺寸。

2020-03-06