爪哇:强/软/弱/幻影参考之间的区别

我已经阅读了这篇关于这个话题的文章 ,但我并不是很了解它。 在描述概念时,请给出一些build议和示例。

Java提供了两种不同types的参考对象 。 弱参考对象可以进一步分为软和 幻像 。 我们一点一点地去。

强参考对象

StringBuilder builder = new StringBuilder(); 

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

弱参考对象

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

弱引用对象不是引用对象的默认types/类,要被使用,应该像上面的例子那样明确地指定它们。 这种参考使参考对象有资格获得GC。 也就是说,如果内存中StringBuilder对象可以访问的唯一引用实际上是弱引用,则允许GC垃圾收集StringBuilder对象。 当内存中的对象只能被弱参考对象访问时,它将自动符合GC要求。

虚弱的程度

可以招募两个不同程度的弱点: 柔和幻影

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

另一方面, 幻影引用对象仅用于确切地知道对象何时已被有效地从内存中移除:通常它们用于修复奇怪的finalize()复活/复活行为 ,因为它们实际上不返回对象本身,而是只有帮助跟踪记忆的存在 。

弱引用对象是实现高速caching模块的理想select。 实际上,只要强引用链不再可访问对象/值,就可以通过允许GC清理内存区域来实现某种自动驱逐。 一个例子是WeakHashMap保留弱密钥。

弱参考:

简而言之,一个薄弱的参照是一个不足以强迫一个客体留在记忆中的参照。 弱引用允许你利用垃圾收集器的能力来确定你的可达性,所以你不必自己去做。

软参考:

一个软引用就像一个弱引用,除了它不那么渴望抛弃它引用的对象。 一个弱可达的对象(最强引用是WeakReferences)将在下一个垃圾回收循环中被丢弃,但是一个可以轻松到达的对象通常会持续一段时间。

幻影参考:

幻影参考与SoftReference或WeakReference完全不同。 它抓住它的对象是非常脆弱的,你甚至不能检索对象 – 它的get()方法总是返回null。 这个引用的唯一用处是跟踪它何时被引入到一个ReferenceQueue中,因为那时你知道它指向的对象已经死了。

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

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

SoftReferenceWeakReference之间的区别是决定清除和排队引用的时间点:

  • SoftReference应该尽可能晚地被清除和排入队列,也就是说,如果虚拟机有内存不足的危险。

  • WeakReference可以被清除,并且一旦被认为是弱引用的,就排队。

您使用的三个术语大部分与Object收集垃圾的资格有关。

弱引用 ::它的引用不够强大,不足以强制对象留在内存中。 它的垃圾收集器的兴致勃勃收集垃圾收集该对象。 你不能强制GC不收集它

软引用 ::它或多或less像弱引用一样。 但是可以说,它比垃圾收集的弱引用更强大地保持对象。

如果垃圾收集者在第一个生命周期本身收集到弱引用,则会在下一个垃圾收集周期中收集软引用。

强引用 ::它与上述两种引用恰好相反。 他们不太喜欢垃圾收集(大多数情况下,他们从来没有收集)。

您可以参考以下链接了解更多信息:

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html

4度的参考 – Strong, Weak, Soft, Phantom

强 – 是一种引用,它使被引用的对象不符合GC的条件。 build设者类。 例如 – StringBuilder

弱 – 是有资格参考GC的参考。

软 – 是一种引用,其对象符合GC的条件,直到内存有效。 最适合图像caching。 它会保持直到内存可用。

幻影 – 是一种直接有资格获得GC的参考。 仅用于知道何时从内存中删除对象。

用途:

  1. 允许您识别对象何时从内存中完全删除。

  2. finalize()方法被重载时,那么对于这两个类的GC符合条件的对象,GC可能不会及时发生。 因此,幻像引用使得它们在finalize()之前符合GC的条件,这就是为什么即使大部分堆都是垃圾时也能获得OutOfMemoryErrors的原因。

弱引用是实现caching模块的理想select。