【问题标题】:Setting null objects for GC vs WeakReference in Java在 Java 中为 GC 与 WeakReference 设置空对象
【发布时间】: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 “可能会超出范围”是什么意思?

标签: java garbage-collection


【解决方案1】:

你的例子不是一个特别好的例子。这肯定不是有效的use-case for a WeakReference。对于初学者来说,Integer 1 将始终存在于 the Integer cache 中,因此将始终对其有很强的引用。

WeakReference 将持有对对象的引用,只要其他东西持有对它的(强)引用。想象一个特别的fickle person。他们会喜欢电视节目/歌曲/电影……但前提是其他人喜欢。一旦其他人不再喜欢那个东西,他们也会立即失去兴趣。


另外,这里要小心:

WeakReference<Integer> soft

WeakReferenceSoftReferenceclosely related but are not interchangeable

【讨论】:

  • 变量设置为null没用吗?如果是这样,我们还要如何声明我们希望对一个对象进行垃圾回收?
  • 局部变量?是的,大多数时候它是无用的。他们很快就会去out of scope 并且无论如何都将有资格进行垃圾收集。类的领域是一个稍微不同的事情。有时有正当理由使这些为空。
  • @Michael 对于优化的代码,局部变量甚至没有必要超出范围。重要的是,该对象是否随后被使用。对于未优化的执行,即使变量超出范围,引用有时也可能会挂在堆栈帧中。通常,没关系。只有在极少数的极端情况下,将变量设置为 null 可能有意义(这需要了解底层字节码和特定 JVM 的垃圾收集算法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2019-05-15
  • 2018-10-02
  • 1970-01-01
  • 2018-11-16
  • 2011-10-13
  • 1970-01-01
相关资源
最近更新 更多