在Java中,软引用的一个使用场景是什么?当JVM内存不足时,它是否有用于垃圾回收非关键项以释放足够的资源以便在关闭JVM之前转储关键信息?
它们被称为软引用,是因为它们是“软”的,并且在“承受压力”(即JVM内存不足)时会断开。我理解弱引用和虚引用,但不太清楚什么情况下需要使用软引用。
在Java中,软引用的一个使用场景是什么?当JVM内存不足时,它是否有用于垃圾回收非关键项以释放足够的资源以便在关闭JVM之前转储关键信息?
它们被称为软引用,是因为它们是“软”的,并且在“承受压力”(即JVM内存不足)时会断开。我理解弱引用和虚引用,但不太清楚什么情况下需要使用软引用。
软引用的一个用途是缓存。假设您想维护一个大对象的内存缓存,但您不希望该缓存占用可以用于其他目的的内存(因为可以重建缓存)。通过维护指向对象的软引用缓存,JVM 可以释放引用的对象并重新利用它们占据的内存用于其他目的。缓存仅需要在遇到无效的软引用时清除它们。
另一个用途可能是在内存受限的设备上(如移动电话)中维护应用程序图像。随着用户打开应用程序,以前的应用程序图像可以维护为软引用,以便如果内存被需要其他事情而清除,则仍然存在,但如果没有对内存的需求,则允许用户更快地返回到应用程序。如果以前的应用程序内存被需要用于其他事情,这将允许其被回收。
这篇文章让我对弱引用、软引用和虚引用有了很好的理解。以下是摘要:
弱引用,简单来说,就是一个引用不足以强制使对象保留在内存中的引用。弱引用允许您利用垃圾收集器的能力为您确定可达性,因此您无需自己执行操作。
软引用与弱引用几乎相同,只是它不太急于丢弃所引用的对象。 只有弱可达(最强引用是“WeakReferences”)的对象将在下一个垃圾回收周期中被丢弃,但是弱可达的对象通常会保留一段时间。
虚引用与任何一种引用都不同。它对其对象的掌握非常脆弱,您甚至不能检索该对象--其
get()
方法始终返回null
。这种引用的唯一用途是跟踪何时将其加入到ReferenceQueue
中,因为此时您知道其指向的对象已死亡。
finalize
方法更安全的终结操作(我在一个分析工具的帮助文本中读到了这一点,但在这里找到了一些讨论 - http://code-o-matic.blogspot.com/2009/01/subtleties-of-phantomreference-and.html)。 - Kevin Brock我能想到的最好的例子就是缓存。如果内存成为问题,您可能不介意清除缓存中最老的条目。缓存大型对象图也可能导致这种情况。