代码之家  ›  专栏  ›  技术社区  ›  Malax

等待特定对象的垃圾收集

  •  5
  • Malax  · 技术社区  · 15 年前

    我只是在公共空间的IO图书馆里翻找,发现了:

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

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

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

    2 回复  |  直到 15 年前
        1
  •  9
  •   Adam Paynter    15 年前

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

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

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

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

    与软引用和弱引用不同,虚引用在排队时不会被垃圾收集器自动清除。通过幻象引用可访问的对象将保持不变,直到清除所有此类引用或它们自己变得不可访问为止。

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

    referent -新模型引用将引用的对象

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

    这个 Q 参数是 ReferenceQueue 班级。这个 幻影参考 将添加到此 参考数据 当它的时候 参照物 变得幻影可及。发生这种情况时,您可以检索 幻影参考 通过使用 poll() remove() 方法 参考数据 班级。

    例如:

    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!
    

    注: 幻影参考 具有名为的兄弟类 SoftReference WeakReference 这也可能有用。它们之间的关系记录在 java.lang.ref package documentation .

        2
  •  1
  •   Justin    15 年前

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

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