从Ethan Nicholas的《理解弱引用》中:
参考不足
一个弱引用,简单地说,是不是强大到足以迫使对象保留在内存中的参考。弱引用使您可以利用垃圾收集器的能力来确定您的可达性,因此您不必自己做。您创建像这样的弱引用:
WeakReference weakWidget = new WeakReference(widget);
然后可以在代码中的其他地方使用 weakWidget.get()以获得实际的 Widget对象。当然,弱引用不足以阻止垃圾回收,因此您可能会发现(如果没有对小部件的强引用) weakWidget.get()突然开始返回null。
…
软参考
甲软参考酷似弱引用,不同之处在于它是更少急于扔掉其所引用的对象。只有弱可达性的对象(对其最强的引用是
WeakReferences)将在下一个垃圾回收周期中被丢弃,但是柔弱可达性的对象通常会停留一段时间。
SoftReferences并不需要向任何行为不同于
WeakReferences,但在实践中轻轻地可达对象一般保留,只要内存供应充足。这使它们成为缓存(例如上述图像缓存)的良好基础,因为您可以让垃圾收集器担心对象的可访问性(一个高度可访问的对象将永远不会从缓存中删除)。需要他们正在消耗的内存。
彼得·凯斯勒
(Peter Kessler)在评论中添加:
Sun JRE确实将
SoftReference与
WeakReferences区别对待。如果可用内存没有压力,我们尝试保留由SoftReference引用的对象。一个细节:“-client”和“ -server” JRE的策略不同:-client JRE倾向于通过清除SoftReferences而不是扩展堆来减小占用的空间,而-server JRE尝试保持您的占用空间。通过扩大堆(如果可能)而不是清除SoftReferences,可以提高性能。一种尺寸并不适合所有尺寸。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)