【问题标题】:Does WeakReference<> helps with GC on this specific scenario?WeakReference<> 在这种特定情况下是否有助于 GC?
【发布时间】:2020-08-31 14:41:18
【问题描述】:

我不确定从长远来看这是否会给我带来一些内存泄漏问题,我想知道在这种情况下使用弱引用是否有什么不同:

public abstract class ChangeObserver<X extends SomeClass> {

   X someClass;

   public ChangeObserver(X someClass) {
       this.someClass= someClass;
   }

   public void notifySomeClass(
   ) {
       onChanged().onChanged(someClass);
   }

   public abstract OnDataChanged<X> onChanged();

   @FunctionalInterface
   public interface OnDataChanged<X> {
       void onChanged(X x);
   }

}

这会导致程序生命周期出现问题吗?它会通过使用弱引用来解决吗?

感谢@Hulk 和@tashkhisi,我提供了这个解决方案,如果有什么遗漏,请不要犹豫,立即纠正。

public abstract class ChangeObserver<X extends SomeClass> {

    private WeakReference<X> someClassWeakRef;
    private OnDataChanged<X> observer;

    public ChangeObserver(X someClass) {
        this.someClassWeakRef = new WeakReference<>(someClass);
        observer = onChanged();
    }

    public void notifySomeClass(
    ) {
        observer.onChanged(someClassWeakRef.get());
    }

    public abstract OnDataChanged<X> onChanged();

    @FunctionalInterface
    public interface OnDataChanged<X> {
        void onChanged(X x);
    }

}

我仍然缺少的是这个 removeObserver() 方法究竟应该做什么来删除观察者,如果我要使用避免内存泄漏的特定方法,它只是简单地设置观察者 = null ?

提前致谢。

【问题讨论】:

  • 您预计会有什么样的泄漏?您认为哪个参考资料会变成WeakReference - someClass
  • onChanged()(第一个)到底是什么?
  • 嗨@Hulk,感谢您的关注,如果这个对象的封闭类被破坏,这个对象中对SomeClass的引用不会阻止整个封闭类获得GC吗? onChanged()(第一个)是接口的构造/初始化的抽象方法调用。
  • 引用someClass 可以使引用的对象保持活动状态,但如果从ChangeObserver 派生的对象不再从其他任何地方引用,则此引用不会改变其生命周期。即使有循环引用——大多数 Java GC 实现都可以很好地处理循环,只要不再有来自“外部”的引用。
  • 无论哪种方式,我担心这个问题有点太模糊,无法明确回答 - 我们需要一个具体的使用场景,包括观察者和被观察者等。这可能会很多要阅读的代码;-) 我建议您尝试一下,可能通过分析器运行它以监控 GC 并查看是否真的存在问题。

标签: java memory-leaks lifecycle weak-references


【解决方案1】:

是的 有很多方法可以解决Observer 中的内存泄漏问题,Java 中的模式之一是在您的类中添加另一种方法,例如removeObserver,以便在您不需要它们时从Observable 中删除 Observer 对象第二种方法是使用弱引用,如下所示:(我宁愿将其命名为someObject 而不是someClass,但我已遵守您的命名约定)

WeakReference<X> x = new WeakReference<X>(someClass); 

【讨论】:

  • 非常感谢@tashkhisi 的回答。
  • @Delark 这是一个糟糕的答案,坦率地说,我不知道它如何解决任何问题。所以你将Xinstance 包装成WeakReference,所以呢?这给了你什么?而您将名称保留为 someClass(如果这真的是 Class&lt;?&gt;,那么 WeakReference 在此处甚至更毫无意义)这一事实表明您不了解它的作用。唯一的一点是使用WeakReference 是在所指对象消失时反应(即get 返回null),你甚至没有远程解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多