Java中软引用的使用场景是什么?

15

在Java中,软引用的一个使用场景是什么?当JVM内存不足时,它是否有用于垃圾回收非关键项以释放足够的资源以便在关闭JVM之前转储关键信息?

它们被称为软引用,是因为它们是“软”的,并且在“承受压力”(即JVM内存不足)时会断开。我理解弱引用和虚引用,但不太清楚什么情况下需要使用软引用。

4个回答

20

软引用的一个用途是缓存。假设您想维护一个大对象的内存缓存,但您不希望该缓存占用可以用于其他目的的内存(因为可以重建缓存)。通过维护指向对象的软引用缓存,JVM 可以释放引用的对象并重新利用它们占据的内存用于其他目的。缓存仅需要在遇到无效的软引用时清除它们。

另一个用途可能是在内存受限的设备上(如移动电话)中维护应用程序图像。随着用户打开应用程序,以前的应用程序图像可以维护为软引用,以便如果内存被需要其他事情而清除,则仍然存在,但如果没有对内存的需求,则允许用户更快地返回到应用程序。如果以前的应用程序内存被需要用于其他事情,这将允许其被回收。


只是补充一下,软引用在原则上与Linux(或任何其他操作系统)的内存管理系统相同,其中页面按需加载。只不过Linux可以实现多个页面替换算法。那Java垃圾收集器呢?它是否(或者可以配置为)使用对象的使用模式来选择要垃圾回收的软引用呢? - Rohit Banga

16

这篇文章让我对弱引用、软引用和虚引用有了很好的理解。以下是摘要:

弱引用,简单来说,就是一个引用不足以强制使对象保留在内存中的引用。弱引用允许您利用垃圾收集器的能力为您确定可达性,因此您无需自己执行操作。

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

虚引用与任何一种引用都不同。它对其对象的掌握非常脆弱,您甚至不能检索该对象--其get()方法始终返回null。这种引用的唯一用途是跟踪何时将其加入到ReferenceQueue中,因为此时您知道其指向的对象已死亡。


这是我正在寻找的类型的文本:+1 作为摘要 :) 至于幽灵引用...它看起来非常奇怪,我猜它的主要目的是作为调试工具或类似工具的工件。 - OscarRyz
1
@Oscar:幽灵引用也可以用于创建比标准的finalize方法更安全的终结操作(我在一个分析工具的帮助文本中读到了这一点,但在这里找到了一些讨论 - http://code-o-matic.blogspot.com/2009/01/subtleties-of-phantomreference-and.html)。 - Kevin Brock
链接现在是404错误;( - xxy
@xxy:谢谢,我现在已经把它替换成了互联网档案馆的链接。 - BalusC

3

我能想到的最好的例子就是缓存。如果内存成为问题,您可能不介意清除缓存中最老的条目。缓存大型对象图也可能导致这种情况。


0

SoftReference 如何用作缓存的示例可以在此 post 中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接