对包含嵌套强引用的对象的弱引用和垃圾回收
假设我对一辆汽车的引用很弱,而这辆车对发动机有一个普通(强)的引用。不存在对汽车或发动机的其他引用。引擎可以被垃圾回收吗?
假设我对一辆汽车的引用很弱,而这辆车对发动机有一个普通(强)的引用。不存在对汽车或发动机的其他引用。引擎可以被垃圾回收吗?
是的,它可以,这正是弱引用设计的工作方式。弱引用是对象对应用程序具有的根,即使该对象可能具有其他强引用,重要的是根引用,并且由于根引用是弱引用,因此该对象将成为垃圾回收的候选对象。
有关更多信息,请参阅弱引用
类文档:
弱引用对象,这些对象不会阻止其引用成为可最终确定、最终确定然后回收的对象。弱引用最常用于实现规范化映射。
假设垃圾回收器在某个时间点确定某个对象的可访问性很弱。届时,它将原子清除对该对象的所有弱引用,以及对任何其他弱可访问对象的所有弱引用,该对象可通过强引用和软引用链访问。同时,它将声明所有以前弱可访问的对象都是可最终确定的。在同一时间或稍后的某个时间,它将对那些新清除的已在引用队列中注册的弱引用进行排队。
仅供参考,Java还提供了另外两个参考
子类:SoftReference
和PhantomReference
。WeakReference
Car 实例可能会被垃圾回收,但不能保证在下一个 GC 周期中会被垃圾回收,甚至根本无法保证它会被回收。例如
在 GC 运行之前的某个时间,应用程序可以调用 并保存对某个可访问对象的 in(例如)属性的引用。然后,该实例将变得完全可访问,并且不再符合垃圾回收的条件。get
WeakReference
Car
Car
如果 GC 以所描述的状态运行,则 JVM 规范不保证在下一个 GC 周期中会检测到弱可访问性。例如,如果给定的GC周期仅收集最新一代(并且已提升为老一代),则GC不会确定它是弱可访问的。Car
Car
即使 GC 中断对弱引用中的 的引用,也不会立即回收实例。相反,现在无法到达的回收可能会在以后的GC周期中发生(在可能最终确定之后)。Car
Car
Car