如何防止GC收集弱引用对象?

时间:2011-05-31 11:33:03

标签: java reference weak-references

我有一个内部使用弱引用的对象缓存,有时即使我仍然需要它,我的对象也会得到GC(因此需要重新加载)。 我的想法是通过添加对该对象的另一个引用来阻止GC:

Object obj = Cache.getObject(key);
  1. obj 是强或弱的参考?

  2. 这似乎适用于我的情况,但我不确定这是否正确,所以我很感激任何建议。

  3. P.S。我无法更改Cache实现。

3 个答案:

答案 0 :(得分:2)

obj是正常的(即强大的)参考。

只要变量obj可以访问,该对象就不符合GC的条件。所以:是的,这会阻止对象的收集。

答案 1 :(得分:2)

一旦执行Object obj = Cache.getObject(key)行,obj引用的对象现在强烈引用,不会被垃圾回收(但obj是超出范围,引用的对象可能有资格进行垃圾回收)。

答案 2 :(得分:1)

如果你不想要某些东西得到GC,你应该坚持参考它。如果一个代码的性能会因为对象消失而受到不利影响,那么最后一个强引用就会失效,那么该代码应被视为已损坏。

主要的弱引用是必不可少的,在这种情况下,一个对象引用了一些它并不真正关心的东西,但是如果有其他对象关心它,它会被更新或观察。例如,套接字监视器可能会接收所有传入的数据包并将它们放入队列,以便数据包日志窗口可以将它们拉出并显示它们。如果应该从队列中读取的对象在没有通知套接字监视器的情况下消失,并且套接字监视器具有对队列的强引用,则它可以继续向队列添加数据包,即使没有人对读取它们感兴趣。但是,如果套接字监视器使用WeakReference作为队列,那么在应该从队列中读取的对象消失之后的某个时刻,队列将有资格进行垃圾收集(因为套接字监视器只能保存弱引用)。一旦队列被垃圾收集,套接字监视器就会注意到它的WeakReference已经失效并且可能自行关闭。