我只是在commons-io库中挖掘并找到了这个:
Keeps track of files awaiting deletion, and deletes them when an associated marker object is reclaimed by the garbage collector.
这可以在FileCleaningTracker
对象的文档中找到。
现在我很好奇我怎么能自己做到这一点?我的代码如何检测垃圾收集器何时回收对象?
答案 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}}包含名为SoftReference
和WeakReference
的同级类,它们也可能有用。它们之间的关系记录在java.lang.ref package documentation。
答案 1 :(得分:1)
不确定这是否真的回答了你的问题,但是在回收资源之前调用了对象的finalize()方法。
编辑:这意味着您可以向另一个对象发送消息以提醒它,或者沿着这些行发送消息。