等待特定对象的垃圾收集

我只是在commons-io库中挖掘并发现了这个:

跟踪等待删除的文件,并在删除时将其删除
垃圾收集器回收关联的标记对象。

这可以在FileCleaningTracker对象的文档中找到。

现在我很好奇我怎么能自己做到这一点? 我的代码如何检测垃圾收集器何时回收对象?

根据源代码 ,它使用PhantomReference类。 根据文件:

幻影参考对象,在收集器之后排队,确定可以回收它们的对象。 幻像引用最常用于以比Java终结机制更灵活的方式调度预先清理操作。

如果垃圾收集器在某个时间点确定幻像引用的引用是幻像可达的,那么在那个时间或稍后它将使引用入队。

为了确保可回收对象保持不变,可能无法检索幻像引用的引用:幻像引用的get方法始终返回null。

与软引用和弱引用不同,垃圾收集器在排队时不会自动清除幻像引用。 可以通过幻像引用访问的对象将保持不变,直到所有此类引用都被清除或自身无法访问。

PhantomReference构造函数接受两个参数:

referent – 新幻像引用将referent的对象

q – 要注册引用的队列,如果不需要注册,则为null

q参数是ReferenceQueue类的一个实例。 当它的referent变为幻像可达时, PhantomReference将被添加到此ReferenceQueue 。 发生这种情况时,您可以使用ReferenceQueue类的poll()remove()方法检索PhantomReference

例如:

 T objectToWatch = ...; ReferenceQueue referenceQueue = new ReferenceQueue(); new PhantomReference(objectToWatch, referenceQueue); // Later on, probably in another thread... Reference nextReference = referenceQueue.remove(); // Tidy up! 

注意: PhantomReference具有名为SoftReferenceWeakReference兄弟类,它们也可能有用。 它们之间的关系记录在java.lang.ref包文档中 。

不确定这是否真的回答了你的问题,但是在回收资源之前调用了对象的finalize()方法。

编辑:这意味着您可以将消息发送到另一个对象以提醒它,或者沿着这些行发送消息。