Java:强/软/弱/幻像引用之间的区别
我读过这篇关于Java中不同类型的引用(强,软,弱,幻像)的文章,但我并不真正理解它。
这些引用类型之间有什么区别,何时使用每种类型?
我读过这篇关于Java中不同类型的引用(强,软,弱,幻像)的文章,但我并不真正理解它。
这些引用类型之间有什么区别,何时使用每种类型?
Java提供了两种不同类型的参考对象:强和弱。弱参考对象可以进一步分为软引用对象和幻像对象。
让我们一点一点地去吧。
强引用对象
StringBuilder builder = new StringBuilder();
这是引用对象的默认类型/类,如果没有不同地指定:是一个强引用对象。这种引用使引用的对象不符合 GC 的条件。也就是说,每当一个对象被一连串强引用对象引用时,它都不能被垃圾回收。builder
弱引用对象
WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);
弱引用对象不是引用对象的默认类型/类,要使用它们,应像上面的示例中那样显式指定它们。这种引用使引用对象符合 GC 的条件。也就是说,如果内存中对象唯一可访问的引用实际上是弱引用,则允许GC对对象进行垃圾回收。当内存中的对象只能由弱参照对象访问时,它将自动符合 GC 的条件。StringBuilder
StringBuilder
虚弱程度
可以列出两种不同级别的弱点:软弱和幻影。
软参考对象基本上是一个弱参考对象,在内存中保留得更多一点:通常,它会抵抗GC循环,直到没有内存可用并且存在风险(在这种情况下,可以将其删除)。OutOfMemoryError
另一方面,幻像参考对象仅用于确切地知道对象何时已从内存中有效删除:通常它们用于修复奇怪的finize()复活/复活行为,因为它们实际上不返回对象本身,而仅有助于跟踪其内存存在。
弱引用对象是实现缓存模块的理想选择。事实上,当强引用链不再可访问对象/值时,允许GC清理内存区域,可以实现一种自动逐出。一个例子是 WeakHashMap 保留弱键。
弱参考 :
简单地说,弱引用是一个不够强的引用,无法强制对象保留在内存中。弱引用允许您利用垃圾回收器的能力来确定可访问性,因此您不必自己动手。
软参考 :
软引用与弱引用完全相同,只是它不太急于丢弃它所引用的对象。一个只有弱可访问的对象(对它最强的引用是弱引用)将在下一个垃圾回收周期中被丢弃,但是一个可软访问的对象通常会停留一段时间。
幻像参考 :
幻像引用与 SoftReference 或 WeakReference 完全不同。它对对象的控制非常脆弱,您甚至无法检索对象 - 它的get()方法始终返回null。这种引用的唯一用途是跟踪它何时排队到参考队列中,因为此时您知道它所指向的对象是死的。
本文摘自:https://weblogs.java.net/blog/2006/05/04/understanding-weak-references