Java中软引用的用例是什么?

2022-09-03 09:22:47

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

它们被称为软引用,因为它们是软的,并且在“施加压力”时会中断,即:JVM已经耗尽了内存。我理解弱引用和幻像引用,但实际上并不需要这些引用。


答案 1

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

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


答案 2

这篇文章让我对它们中的每一个(弱,软和幻像引用)有了很好的理解。以下是一个总结性的引用:

简单地说,弱引用是一个不够强的引用,无法强制对象保留在内存中。弱引用允许您利用垃圾回收器的能力来确定可访问性,因此您不必自己动手。

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

幻像引用与 或 完全不同。它对对象的控制非常脆弱,您甚至无法检索对象 - 它的方法总是返回 。这种引用的唯一用途是跟踪它何时排队成一个,因为在这一点上你知道它所指向的对象是死的。SoftReferenceWeakReferenceget()nullReferenceQueue


推荐