WeakReference和StrongReference GC行为

时间:2014-06-04 10:50:43

标签: java weak-references

我宣布了strong reference -

Data data = new Data();

为了使其符合垃圾收集条件,我将实例设为null -

data = null;

现在,当我将引用设为null时,无法访问该对象,并且在GC运行时会对其进行垃圾回收。

使用WeakReference -

Data data = new Data();
WeakReference<Data> weakRef = new WeakReference<Data>(data);

当我将引用变量设为null时,它将有资格进行垃圾回收。

data = null;

当我们使用StrongReference时,我们将其引用为null以获取GC。如果是WeakRefernce也 我们需要引用object null来使它成为GC。两者之间有什么区别。如果我们只引用对象null,那么在强引用的情况下,它将符合GC的条件,并将在GC运行时收集。

3 个答案:

答案 0 :(得分:3)

如果你有纠结的对象(即不再可以访问的对象),垃圾收集器可以收集它们并将它们擦除。注意措辞:允许。这意味着垃圾收集器可以决定不收集它们。事实上,并不能保证根本不会收集任何物品。

SoftReference或WeakReference管理的对象与删除强引用之间的区别是垃圾收集策略:

  • 如果需要记忆,将收集轻柔可达的物品。
  • 首次尝试时将收集到的弱对象。
  • 否则将在收集器的策略中收集无法访问的对象(可能类似于可轻松访问,并且在启动时也可以使用某些JVM参数进行调整)。

尽管如此,这些是关于最可能的策略的假设,但垃圾收集器可能会以另一种方式决定。

请注意:在本地范围内使用时,弱引用和软引用没有意义。它们很可能在实例字段中使用,并且必须始终注意可能已经收集了引用对象的事实。

答案 1 :(得分:1)

区别在于你可以通过调用weakRef.get()来知道GC是否收集了数据,并测试它是否返回null。

答案 2 :(得分:0)

虽然这个帖子已经有了一些很好的答案,但我还想补充一点。在问题中它被要求

&#34;当我们使用StrongReference时,我们将其引用为null以获取GC。在WeakRefernce的情况下,我们还需要引用对象null以使其成为GC。两者有什么区别?&#34;。

假设我们有一个由2个强引用xy引用的Object。如果我们使x = null x引用的对象尚不符合垃圾回收的条件,我们仍然y引用相同的对象。读取y仍将导致输出非空对象。

现在假设我们有一个具有一个强引用的对象,比如x和一个弱引用,y。现在,如果我们生成x = null,我们可以确定该对象有资格进行垃圾回收。 WeakReference不会阻止此对象被垃圾回收。

一旦对象被垃圾回收,在弱引用上调用get()方法可能会返回null。因此,建议在使用前始终检查返回的对象。

(重要)此外,我们需要使得我们不会在任何长期生存硬引用(例如instance fields)中保留返回的非null值。如果我们得到一个弱引用,那么如果我们需要那么我们应该使用弱引用作为实例字段并在任何方法中获取对象,可以使用局部变量来保存返回的对象,应该检查它是否为null,并且如果是,则可以使用该对象进行进一步处理。

现在只是SoftReferences的另一个要点,它们可以防止对象被垃圾收集,直到内存不足(低于阈值)。