我读过这篇关于Java中不同类型引用(强、软、弱、幻影)的文章,但我不是很理解。
这些引用类型之间的区别是什么,什么时候使用每种类型?
我读过这篇关于Java中不同类型引用(强、软、弱、幻影)的文章,但我不是很理解。
这些引用类型之间的区别是什么,什么时候使用每种类型?
当前回答
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。
其他回答
这篇文章对于理解强引用、软引用、弱引用和幻影引用非常有帮助。
总结一下,
如果你对一个对象有强引用,那么这个对象永远不能被GC(垃圾回收器)收集/回收。
如果对一个对象只有弱引用(没有强引用),那么该对象将在下一个GC循环中被GC回收。
如果对对象只有软引用(没有强引用),那么只有当JVM内存耗尽时,GC才会回收该对象。
我们创建对对象的虚引用来跟踪对象何时进入ReferenceQueue队列。一旦您知道可以执行细粒度终结。(这将避免意外地复活对象,因为phantom-reference不给你referrant)。我建议您阅读这篇文章来深入了解这方面的细节。
所以你可以说,强引用具有强大的功能(GC永远不会收集)。
软引用比弱引用更强大(因为它们可以逃避GC循环,直到JVM耗尽内存)
弱引用甚至不如软引用强大(因为它们无法逃脱任何GC循环,如果对象没有其他强引用,则会被回收)。
餐厅的类比
服务员- GC 堆中的对象 餐厅区域/空间-堆空间 新客户-在餐厅想要桌子的新对象
现在,如果您是一个强客户(类似于强引用),那么即使餐厅里来了一个新客户或发生了其他事情,您也不会离开您的表(堆上的内存区域)。服务员没有权利告诉你(甚至要求你)离开餐厅。
如果你是一个软顾客(类似于软参考),那么如果餐厅来了一个新顾客,服务员不会让你离开桌子,除非没有其他空桌子来容纳新顾客。(换句话说,只有当一个新顾客进来,并且没有其他的桌子给这个新顾客时,服务员才会叫你离开桌子)
如果你是一个弱顾客(类似于弱参考),那么服务员可以根据他的意愿(在任何时候)要求你离开餐厅:P
您使用的这三个术语主要与Object获得垃圾收集的资格有关。
弱引用:它是一个不够强的引用,不足以迫使对象保留在内存中。为了垃圾回收而收集该对象是垃圾收集器的心血来潮。 你不能强迫GC不收集它。
软引用:它或多或少类似于弱引用。但是您可以说,它比垃圾收集中的弱引用更强地保存对象。
如果垃圾收集器在第一个生命周期中收集弱引用,它将在下一个垃圾收集周期中收集软引用。
强参考:它正好与上面两种参考相反。 他们不太喜欢被垃圾收集(大多数情况下他们从未被收集过)。
你可以参考下面的链接了解更多信息:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html
软参考和弱参考之间的简单区别是由Android开发者提供的。
软引用和弱引用之间的区别是决定清除引用并将其排队的时间点:
一个SoftReference应该被清除并尽可能晚地进入队列, 即防止虚拟机存在内存不足的危险。 WeakReference可以在已知的情况下被清除并加入队列 weakly-referenced。
弱参考:
简单地说,弱引用是指没有强到足以迫使对象保留在内存中的引用。弱引用允许您利用垃圾收集器的能力来确定您的可达性,因此您不必自己做这件事。
软参考:
软引用与弱引用完全相似,只是它不太急于丢弃所引用的对象。只有弱可及性的对象(对它的最强引用是WeakReferences)将在下一个垃圾收集周期中被丢弃,但软可及性的对象通常会保留一段时间。
幻影参考:
虚引用与软引用或弱引用是完全不同的。它对对象的控制是如此脆弱,以至于您甚至无法检索对象——它的get()方法总是返回null。这种引用的唯一用途是跟踪它何时进入ReferenceQueue队列,因为在这一点上,您知道它所指向的对象已经死亡。
本文摘自:https://weblogs.java.net/blog/2006/05/04/understanding-weak-references
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。