java.lang.ref.WeakReference和有什么区别java.lang.ref.SoftReference?
java.lang.ref.WeakReference
java.lang.ref.SoftReference
来自Ethan Nicholas 的《理解弱引用》:
弱引用 简而言之,弱引用 是一种强度不足以迫使对象保留在内存中的引用。弱引用允许您利用垃圾收集器为您确定可达性的能力,因此您不必自己做。您可以像这样创建一个弱引用: WeakReference weakWidget = new WeakReference(widget); 然后在代码的其他地方,您可以使用它 weakWidget.get()来获取实际 Widget对象。当然,弱引用的强度不足以阻止垃圾收集,因此您可能会发现(如果没有对小部件的强引用) weakWidget.get()突然开始返回null. … 软参考 软 引用 与弱引用完全一样,只是它不太急于丢弃它所引用的对象。只能弱可达的对象(对它的最强引用是WeakReferences)将在下一个垃圾回收周期被丢弃,但软可达的对象通常会保留一段时间。 SoftReferences不需要与 有任何不同的行为 ,WeakReferences但实际上只要内存充足,通常会保留可轻松访问的对象。这使得它们成为缓存的一个很好的基础,例如上面描述的图像缓存,因为你可以让垃圾收集器担心对象的可达性(一个强可达的对象 永远不会 从缓存中删除)以及它的严重程度。需要他们正在消耗的内存。
弱引用
简而言之,弱引用 是一种强度不足以迫使对象保留在内存中的引用。弱引用允许您利用垃圾收集器为您确定可达性的能力,因此您不必自己做。您可以像这样创建一个弱引用:
WeakReference weakWidget = new WeakReference(widget);
然后在代码的其他地方,您可以使用它 weakWidget.get()来获取实际 Widget对象。当然,弱引用的强度不足以阻止垃圾收集,因此您可能会发现(如果没有对小部件的强引用) weakWidget.get()突然开始返回null.
weakWidget.get()
Widget
null
…
软参考
软 引用 与弱引用完全一样,只是它不太急于丢弃它所引用的对象。只能弱可达的对象(对它的最强引用是WeakReferences)将在下一个垃圾回收周期被丢弃,但软可达的对象通常会保留一段时间。
WeakReferences
SoftReferences不需要与 有任何不同的行为 ,WeakReferences但实际上只要内存充足,通常会保留可轻松访问的对象。这使得它们成为缓存的一个很好的基础,例如上面描述的图像缓存,因为你可以让垃圾收集器担心对象的可达性(一个强可达的对象 永远不会 从缓存中删除)以及它的严重程度。需要他们正在消耗的内存。
SoftReferences
彼得凯斯勒在评论中补充道:
Sun JRE 对 SoftReference 的处理与 WeakReference 不同。如果可用内存没有压力,我们会尝试保留由 SoftReference 引用的对象。一个细节:“-client”和“-server”JRE 的策略是不同的:-client JRE 试图通过更喜欢清除 SoftReferences 而不是扩展堆来保持你的占用空间小,而 -server JRE 试图保持你的通过更喜欢扩展堆(如果可能)而不是清除 SoftReferences 来提高性能。一种尺寸并不适合所有人。