我读过这篇关于Java中不同类型引用(强、软、弱、幻影)的文章,但我不是很理解。
这些引用类型之间的区别是什么,什么时候使用每种类型?
我读过这篇关于Java中不同类型引用(强、软、弱、幻影)的文章,但我不是很理解。
这些引用类型之间的区别是什么,什么时候使用每种类型?
当前回答
4个参照度-强,弱,软,幻影
强-是一种引用,它使被引用的对象不 有资格获得GC。构建器类。StringBuilder Weak -是一个符合GC条件的引用。 Soft -是一种引用,其对象在内存可用之前都有资格进行GC。最适合图像缓存。它将保存它们,直到内存可用为止。 幻影——是一种引用,其对象直接适合GC。仅用于了解对象何时从内存中删除。
用途:
允许您识别对象何时从内存中完全删除。 当finalize()方法重载时,对于两个类中符合GC条件的对象可能不会及时进行GC。因此,幻影引用使它们有资格在finalize()之前进行GC,这就是为什么即使堆的大部分是垃圾,您也可以获得OutOfMemoryErrors。
弱引用是实现缓存模块的理想方法。
其他回答
您使用的这三个术语主要与Object获得垃圾收集的资格有关。
弱引用:它是一个不够强的引用,不足以迫使对象保留在内存中。为了垃圾回收而收集该对象是垃圾收集器的心血来潮。 你不能强迫GC不收集它。
软引用:它或多或少类似于弱引用。但是您可以说,它比垃圾收集中的弱引用更强地保存对象。
如果垃圾收集器在第一个生命周期中收集弱引用,它将在下一个垃圾收集周期中收集软引用。
强参考:它正好与上面两种参考相反。 他们不太喜欢被垃圾收集(大多数情况下他们从未被收集过)。
你可以参考下面的链接了解更多信息:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html
Java提供了两种不同类型/类的引用对象:强和弱。弱引用对象可以进一步分为软引用对象和虚引用对象。
强大的 弱 软 幻影
让我们逐点分析。
强引用对象
StringBuilder builder = new StringBuilder();
这是默认类型/类的引用对象,如果没有不同的指定:builder是一个强引用对象。这种引用使得被引用的对象不适合GC。也就是说,当一个对象被一串强引用对象引用时,它就不能被垃圾收集。
弱引用对象
WeakReference<StringBuilder> weakBuilder = new WeakReference<StringBuilder>(builder);
Weak Reference Objects are not the default type/class of Reference Object and to be used they should be explicitly specified like in the above example. This kind of reference makes the reference object eligible for GC. That is, in case the only reference reachable for the StringBuilder object in memory is, actually, the weak reference, then the GC is allowed to garbage collect the StringBuilder object. When an object in memory is reachable only by Weak Reference Objects, it becomes automatically eligible for GC.
弱点的程度
有两种不同程度的弱点:软的和幻影的。
软引用对象基本上是一个弱引用对象,它在内存中保留的时间更长一些:通常,它会抵抗GC循环,直到没有可用内存,并且存在OutOfMemoryError的风险(在这种情况下,可以将其删除)。
另一方面,虚引用对象仅在确切地知道对象何时已从内存中有效移除时有用:通常它们用于修复奇怪的finalize()复活/复活行为,因为它们实际上不返回对象本身,而只是帮助跟踪它们在内存中的存在。
弱引用对象是实现缓存模块的理想对象。事实上,当强引用链不再访问对象/值时,可以允许GC清理内存区域,从而实现一种自动清除。一个例子是保留弱键的WeakHashMap。
软参考和弱参考之间的简单区别是由Android开发者提供的。
软引用和弱引用之间的区别是决定清除引用并将其排队的时间点:
一个SoftReference应该被清除并尽可能晚地进入队列, 即防止虚拟机存在内存不足的危险。 WeakReference可以在已知的情况下被清除并加入队列 weakly-referenced。
4个参照度-强,弱,软,幻影
强-是一种引用,它使被引用的对象不 有资格获得GC。构建器类。StringBuilder Weak -是一个符合GC条件的引用。 Soft -是一种引用,其对象在内存可用之前都有资格进行GC。最适合图像缓存。它将保存它们,直到内存可用为止。 幻影——是一种引用,其对象直接适合GC。仅用于了解对象何时从内存中删除。
用途:
允许您识别对象何时从内存中完全删除。 当finalize()方法重载时,对于两个类中符合GC条件的对象可能不会及时进行GC。因此,幻影引用使它们有资格在finalize()之前进行GC,这就是为什么即使堆的大部分是垃圾,您也可以获得OutOfMemoryErrors。
弱引用是实现缓存模块的理想方法。
弱参考:
简单地说,弱引用是指没有强到足以迫使对象保留在内存中的引用。弱引用允许您利用垃圾收集器的能力来确定您的可达性,因此您不必自己做这件事。
软参考:
软引用与弱引用完全相似,只是它不太急于丢弃所引用的对象。只有弱可及性的对象(对它的最强引用是WeakReferences)将在下一个垃圾收集周期中被丢弃,但软可及性的对象通常会保留一段时间。
幻影参考:
虚引用与软引用或弱引用是完全不同的。它对对象的控制是如此脆弱,以至于您甚至无法检索对象——它的get()方法总是返回null。这种引用的唯一用途是跟踪它何时进入ReferenceQueue队列,因为在这一点上,您知道它所指向的对象已经死亡。
本文摘自:https://weblogs.java.net/blog/2006/05/04/understanding-weak-references