【发布时间】:2018-05-23 10:30:45
【问题描述】:
我对 WeakReference 的实际作用有点困惑。根据我读到的内容,让我解释一下:
示例 1:
Integer prime = 1;
WeakReference<Integer> soft = new WeakReference<Integer>(prime);
prime = null;
在下一个 gc 循环中,prime 将被收集。到现在为止还挺好。但是如果我在没有 WeakReference 的情况下这样做:
Integer prime = 1;
prime = null;
不是一样的吗?由于没有参考,将再次收集 Prime。
【问题讨论】:
-
即使设置为
null也是不必要的,因为prime可能会超出范围并符合GC 条件。这是否意味着WeakReference没用?不,这只是意味着你的例子很差。我建议在WeakReference上搜索现有问题,但您可能不应该太担心它。这是一个非常专业的课程,而不是您经常使用的课程。此外,如果您像默认一样明确设置对null的引用,那是一个坏而无用的习惯。 -
在你的第一个例子中,你可以在下一行写
soft.get(),而在你的第二个例子中你不能这样做。我的意思是 WeakReference 的整个想法不是启用垃圾收集,而是对一个对象进行弱引用,当不再有对它的强引用时,该对象将被 GCed。在某些用例中,WeakReference 就是您想要的。 -
@Kayaman 你为什么不把它写成答案?
-
@Imaskar 我应该找个骗子来代替。
-
@Kayaman “可能会超出范围”是什么意思?