等待特定对象的垃圾收集
我只是在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 extends T> nextReference = referenceQueue.remove(); // Tidy up!
注意: PhantomReference
具有名为SoftReference
和WeakReference
兄弟类,它们也可能有用。 它们之间的关系记录在java.lang.ref包文档中 。
不确定这是否真的回答了你的问题,但是在回收资源之前调用了对象的finalize()方法。
编辑:这意味着您可以将消息发送到另一个对象以提醒它,或者沿着这些行发送消息。