等待特定对象的垃圾收集

时间:2009-08-04 13:32:33

标签: java garbage-collection

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

Keeps track of files awaiting deletion, and deletes them when
an associated marker object is reclaimed by the garbage collector.

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

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

2 个答案:

答案 0 :(得分:9)

根据the source code,它使用PhantomReference类。根据文件:

  

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

     

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

     

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

     

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

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

  

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

     

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

q参数是ReferenceQueue类的实例。当PhantomReference ReferenceQueue变为幻像可访问时,referent将添加到此PhantomReference。发生这种情况时,您可以使用poll()类的remove()ReferenceQueue方法检索T objectToWatch = ...; ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>(); new PhantomReference<T>(objectToWatch, referenceQueue); // Later on, probably in another thread... Reference<? extends T> nextReference = referenceQueue.remove(); // Tidy up!

例如:

PhantomReference

注意:{{1}}包含名为SoftReferenceWeakReference的同级类,它们也可能有用。它们之间的关系记录在java.lang.ref package documentation

答案 1 :(得分:1)

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

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