使用Java的ReferenceQueue

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

不要SoftReferenceWeakReference当为实例变量创建真的只有帮助吗?在方法范围中使用它们有什么好处吗?

另一大部分是ReferenceQueue。除了能够跟踪哪些引用被确定为垃圾,可以Reference.enqueue()用来强制注册垃圾收集对象吗?

例如,是否值得创建一个方法,在对象中使用一些沉重的内存资源(由强引用保存)并创建引用来排列它们?

Object bigObject;
public void dispose() {
    ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
    WeakReference<Object> ref = new WeakReference<Object>(bigObject, queue);
    bigObject = null;
    ref.enqueue();
}

(想象一下,在这种情况下,Object表示一个使用大量内存的对象类型,比如BufferedImage某物)

这是否有实际效果?或者这只是代码的浪费?

提问于
用户回答回答于

引用队列的一个常见习惯用法是例如子类WeakReference来附加清理事物所需的信息,然后轮询一次ReferenceQueue以获得清理任务。

ReferenceQueue<Foo> fooQueue = new ReferenceQueue<Foo>();

class ReferenceWithCleanup extends WeakReference<Foo> {
  Bar bar;
  ReferenceWithCleanup(Foo foo, Bar bar) {
    super(foo, fooQueue);
    this.bar = bar;
  }
  public void cleanUp() {
    bar.cleanUp();
  }
}

public Thread cleanupThread = new Thread() {
  public void run() {
    while(true) {
      ReferenceWithCleanup ref = (ReferenceWithCleanup)fooQueue.remove();
      ref.cleanUp();
    }
  }
}

public void doStuff() {
  cleanupThread.start();
  Foo foo = new Foo();
  Bar bar = new Bar();
  ReferenceWithCleanup ref = new ReferenceWithCleanup(foo, bar);
  ... // From now on, once you release all non-weak references to foo,
      // then at some indeterminate point in the future, bar.cleanUp() will
      // be run. You can force it by calling ref.enqueue().
}
用户回答回答于

如果一个对象只有WeakReferences(或者没有任何引用),那么只要Java需要占用更多的内存空间,它就可以被垃圾收集。所以,WeakReference当你想要一个对象留在内存中时,你可以使用s,但是你不需要它保持这种糟糕的状态(例如,如果Java需要垃圾收集它,没问题,你可以以某种方式回收它,同时Java有更好的表现)

入队a WeakReference允许迭代ReferenceQueue并确定哪些引用已被垃圾收集,哪些没有。这就是全部 - 只有当你需要知道这一点时才这样做。

扫码关注云+社区

领取腾讯云代金券