15

Java中软引用的用例是什么?当 JVM 内存不足时,垃圾收集非关键项目是否有用,以便在关闭 JVM 之前释放足够的资源来转储关键信息?

它们是否被称为软引用,因为它们是软的并且在“承受压力”时会中断,即:JVM 内存不足。我了解弱引用和幻像引用,但在需要这些时并不真正了解。

4

4 回答 4

20

一种用途是缓存。想象一下,您想维护一个大型对象的内存缓存,但您不希望该缓存消耗可用于其他目的的内存(因为缓存总是可以重建)。通过维护对对象的软引用缓存,被引用的对象可以被 JVM 释放,并且它们占用的内存可以重新用于其他目的。缓存只需要在遇到损坏的软引用时清除它们。

另一种用途可能是在内存受限的设备(例如移动电话)上维护应用程序图像。当用户打开应用程序时,以前的应用程序图像可以作为软引用进行维护,这样如果内存需要用于其他用途,它们可以被清除,但如果没有内存需求,它们仍然存在。这将允许用户在内存没有压力的情况下更快地返回应用程序,并允许在其他需要时回收先前应用程序的内存。

于 2010-03-10T23:49:35.467 回答
16

这篇文章让我对它们中的每一个都有了很好的理解(弱引用、软引用和幻像引用)。这是一个摘要引用:

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

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

幻像引用SoftReference 或完全不同WeakReference。它对其对象的控制非常脆弱,以至于您甚至无法检索该对象——它的get()方法总是返回null。这种引用的唯一用途是跟踪它何时被排入 a ReferenceQueue,因为此时您知道它指向的对象已死。

于 2010-03-10T23:56:58.263 回答
3

我能想到的最好的例子是缓存。如果内存出现问题,您可能不介意在缓存中转储最旧的条目。缓存大型对象图也可能使这种情况成为可能。

于 2010-03-10T23:48:40.860 回答
0

可以在这篇文章中找到如何将 SoftReference 用作缓存的示例。

于 2012-05-16T10:40:13.827 回答