小编典典

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

all


阅读 187

收藏
2022-03-01

共1个答案

小编典典

来自Ethan Nicholas
的《理解弱引用》:

弱引用

简而言之,弱引用
是一种强度不足以迫使对象保留在内存中的引用。弱引用允许您利用垃圾收集器为您确定可达性的能力,因此您不必自己做。您可以像这样创建一个弱引用:

WeakReference weakWidget = new WeakReference(widget);

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

软参考

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

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

彼得凯斯勒在评论中补充道:

Sun JRE 对 SoftReference 的处理与 WeakReference 不同。如果可用内存没有压力,我们会尝试保留由
SoftReference 引用的对象。一个细节:“-client”和“-server”JRE 的策略是不同的:-client JRE
试图通过更喜欢清除 SoftReferences 而不是扩展堆来保持你的占用空间小,而 -server JRE
试图保持你的通过更喜欢扩展堆(如果可能)而不是清除 SoftReferences 来提高性能。一种尺寸并不适合所有人。

2022-03-01