Java:强/软/弱/幻像引用之间的区别

我读过这篇关于Java中不同类型的引用(强,软,弱,幻像)的文章,但我并不真正理解它。

这些引用类型之间有什么区别,何时使用每种类型?


答案 1

Java提供了两种不同类型的参考对象。弱参考对象可以进一步分为引用对象和幻像对象

    • 幽灵

让我们一点一点地去吧。

强引用对象

StringBuilder builder = new StringBuilder();

这是引用对象的默认类型/类,如果没有不同地指定:是一个强引用对象。这种引用使引用的对象不符合 GC 的条件。也就是说,每当一个对象被一连串强引用对象引用时,它都不能被垃圾回收。builder

弱引用对象

WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);

弱引用对象不是引用对象的默认类型/类,要使用它们,应像上面的示例中那样显式指定它们。这种引用使引用对象符合 GC 的条件。也就是说,如果内存中对象唯一可访问的引用实际上是弱引用,则允许GC对对象进行垃圾回收。当内存中的对象只能由弱参照对象访问时,它将自动符合 GC 的条件。StringBuilderStringBuilder

虚弱程度

可以列出两种不同级别的弱点:弱和幻影

参考对象基本上是一个弱参考对象,在内存中保留得更多一点:通常,它会抵抗GC循环,直到没有内存可用并且存在风险(在这种情况下,可以将其删除)。OutOfMemoryError

另一方面,幻像参考对象仅用于确切地知道对象何时已从内存中有效删除:通常它们用于修复奇怪的finize()复活/复活行为,因为它们实际上不返回对象本身,而仅有助于跟踪其内存存在

弱引用对象是实现缓存模块的理想选择。事实上,当强引用链不再可访问对象/值时,允许GC清理内存区域,可以实现一种自动逐出。一个例子是 WeakHashMap 保留弱键。


答案 2

弱参考 :

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

软参考 :

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

幻像参考 :

幻像引用与 SoftReference 或 WeakReference 完全不同。它对对象的控制非常脆弱,您甚至无法检索对象 - 它的get()方法始终返回null。这种引用的唯一用途是跟踪它何时排队到参考队列中,因为此时您知道它所指向的对象是死的。

本文摘自:https://weblogs.java.net/blog/2006/05/04/understanding-weak-references