等待特定对象的垃圾收集

Mal*_*lax 5 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对象的文档中找到.

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

Ada*_*ter 9

根据源代码,它使用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!
Run Code Online (Sandbox Code Playgroud)

注:PhantomReference已命名的兄弟班SoftReference,并WeakReference也可能是有用的.它们之间的关系记录在java.lang.ref包文档中.