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

fre*_*low 16 java garbage-collection weak-references

假设我对一辆普通(强力)引擎的汽车有一个弱引用.没有其他对汽车或发动机的引用.发动机可以收集垃圾吗?

And*_*are 18

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

有关更多信息,请参阅WeakReference课程文档:

弱引用对象,它们不会阻止它们的指示物被最终化,最终化,然后回收.弱引用最常用于实现规范化映射.

假设垃圾收集器在某个时间点确定对象是弱可达的.那时它将原子地清除对该对象的所有弱引用以及对任何其他弱可达对象的所有弱引用,通过一系列强引用和软引用可以从该对象到达该对象.同时,它将声明所有以前弱可达的对象可以最终确定.在同一时间或稍后,它将使用参考队列注册的新清除的弱引用入队.

仅供参考,WeakReferenceJava提供了另外两个子类Reference:SoftReferencePhantomReference.


Ste*_*n C 8

Car实例可能是垃圾收集的,但不能保证它在下一个GC循环中被垃圾收集,甚至根本不会被收集.例如,

  • 在GC运行前一段时间,应用程序可以调用getWeakReference和参考保存到Car在(例如)一些可及对象的属性.Car然后,该实例变得完全可访问,不再符合垃圾回收的条件.

  • 如果GC Car以所述状态运行,则JVM规范不保证在下一个GC循环中将检测到弱可达.例如,如果给定的GC周期仅收集最新一代(并且Car已被提升为旧一代),则GC将不会确定它是弱可达的.

  • 即使GC断开对CarWeakReference中的引用,Car实例也不会立即回收.相反,现在无法到达的回收Car可能会在稍后的GC循环中发生(在可能的最终确定之后).