对包含嵌套强引用的对象的弱引用和垃圾回收

假设我对一辆汽车的引用很弱,而这辆车对发动机有一个普通(强)的引用。不存在对汽车或发动机的其他引用。引擎可以被垃圾回收吗?


答案 1

是的,它可以,这正是弱引用设计的工作方式。弱引用是对象对应用程序具有的根,即使该对象可能具有其他强引用,重要的是引用,并且由于根引用是弱引用,因此该对象将成为垃圾回收的候选对象。

有关更多信息,请参阅弱引用类文档:

弱引用对象,这些对象不会阻止其引用成为可最终确定、最终确定然后回收的对象。弱引用最常用于实现规范化映射。

假设垃圾回收器在某个时间点确定某个对象的可访问性很弱。届时,它将原子清除对该对象的所有弱引用,以及对任何其他弱可访问对象的所有弱引用,该对象可通过强引用和软引用链访问。同时,它将声明所有以前弱可访问的对象都是可最终确定的。在同一时间或稍后的某个时间,它将对那些新清除的已在引用队列中注册的弱引用进行排队。

仅供参考,Java还提供了另外两个参考子类:SoftReferencePhantomReferenceWeakReference


答案 2

Car 实例可能会被垃圾回收,但不能保证在下一个 GC 周期中被垃圾回收,甚至根本无法保证它会被回收。例如

  • 在 GC 运行之前的某个时间,应用程序可以调用 并保存对某个可访问对象的 in(例如)属性的引用。然后,该实例将变得完全可访问,并且不再符合垃圾回收的条件。getWeakReferenceCarCar

  • 如果 GC 以所描述的状态运行,则 JVM 规范不保证在下一个 GC 周期中会检测到弱可访问性。例如,如果给定的GC周期仅收集最新一代(并且已提升为老一代),则GC不会确定它是弱可访问的。CarCar

  • 即使 GC 中断对弱引用中的 的引用,也不会立即回收实例。相反,现在无法到达的回收可能会在以后的GC周期中发生(在可能最终确定之后)。CarCarCar