Java:强/弱/弱/幻像参考之间的区别

问题

关于这个话题,我已经阅读了this article,但我并不理解。在描述概念时,请给我一些建议和示例。


#1 热门回答(109 赞)

Java提供了两种不同类型/类的引用对象:.弱参考对象可以进一步划分为intosoftandphantom。让我们一点一点地去吧。
强引用对象

StringBuilder builder = new StringBuilder();

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

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

弱引用对象不是引用对象的默认类型/类,要使用它们应该像上面的示例中那样明确指定。这种引用使参考对象符合GC的条件。也就是说,如果内存中的StringBuilder对象唯一可达的引用实际上是弱引用,则允许GC垃圾回收StringBuilder对象。当内存中的对象只能由弱引用对象访问时,它将自动符合GC的条件。
弱点水平
可以招募两种不同程度的弱点:softandphantom。

AsoftReference对象基本上是一个弱的引用对象,它在内存中保留了一些:通常,它会阻止GC循环,直到内存可用且没有风险OutOfMemoryError(在这种情况下,它可以被删除)。

另一方面,aphantomReference对象仅用于确切地知道对象何时被有效地从内存中移除:通常它们用于修复最终化()复活/复活行为,因为它们实际上不返回对象本身而仅返回helpin keeping track of their memory presence

弱引用对象是实现缓存模块的理想选择。事实上,只要强引用链无法再访问对象/值,GC就可以实现一种自动驱逐。一个例子是WeakHashMap获得弱键。


#2 热门回答(65 赞)

弱参考:
简单地说,弱引用是一个不足以强制对象保留在内存中的引用。弱引用允许你利用垃圾收集器为你确定可达性的能力,因此你不必自己执行此操作。
软参考:
软引用与弱引用完全相同,只是它不太愿意丢弃它引用的对象。一个只能弱到达的对象(对它的最强引用是WeakReferences)将在下一个垃圾收集周期被丢弃,但是一个可以轻松到达的对象通常会暂停一段时间。
幻影参考:
幻像引用与SoftReference或WeakReference完全不同。它对它的对象的抓地力非常脆弱,甚至无法检索对象 - 它的get()方法总是返回null。这种引用的唯一用途是跟踪它何时被引入ReferenceQueue,因为在那时你知道它指向的对象已经死了。
本文摘自:https://weblogs.java.net/blog/2006/05/04/understanding-weak-references


#3 热门回答(20 赞)

SoftReferenceWeakReference之间的简单区别由Android Developer提供。

aSoftReference和aWeakReference之间的区别是决定清除和排列引用的时间点:

  • 应尽可能晚地清除和排队SoftReference,即,如果VM存在内存不足的危险。
  • 一旦知道弱引用,就可以清除WeakReference并将其排队。