繁体   English   中英

[Java]接口和内存泄漏

[英][Java]Interfaces and memory leaks

考虑到下面的代码块,我对接口和内存泄漏有疑问,它是否会导致内存泄漏? 如果是这样,什么是最佳解决方案或替代方案?

public class MyClass {
    public interface MyClassListener{
         doStuff();
    }

    public doSomething(){}
}

public class OtherClass {

    private List<MyClass> list = new ArrayList<MyClass>();
    private boolean doingStuff = false;

    public void setListener(MyClassListener list) { //Sets the listener}

    public MyClass.MyClassListener listener = new MyClass.MyClassListener() {
        public void doStuff(){ doingStuff = true; }
    }

    public void addMyClass(MyClass obj) {
        obj.setListener(listener);
        list.add(obj);
    }

    public void doSomethingInMyClass(int index) {
        ....update some stuff....
        list.get(index).doSomething();
    }
}

我知道我可以将变量listener声明为static因此它不会保存对OtherClass的引用,并将该引用分配给WeakReference但无论如何我还是会发生内存泄漏? 由于引用将包含对包含列表的对象的引用,该列表包含我的对象。 就像一条链子。

更新资料

我更新了我的问题,如您所见, MyClass有一个名为doSomething()的方法,而OtherClass有一个名为doSomethingInMyClass的方法,该方法调用doSomething方法,但会更新一些参数。 我想要的是避免使用doSomethingInMyClass并始终获得有关更改的通知。

这是您情况的一个示例:

interface I { }

class A {
    List<I> list = new ArrayList<>();
    void add(I item) { list.add(item); }
}

class B {
    A other;
    void setA(A a) {
        final B self = this;
        a.add(new I() { B owner = self; });
        other = a;
    }
}

[...]

public static void main (String[] args)
{                   // 1
    A a = new A();  // 2
    B b = new B();  // 3
    b.setA(a);      // 4
}                   // 5

main的作用域开始处,引用集在(1)中为空。 在(4)中将ab设置为互相引用。 然后在(5)范围的末尾删除对ab的引用。 结果是自引用对象的孤岛。

您可以如下显示可视化的(非null )引用集:

  1. {}
  2. {a, a.list}
  3. {a, a.list, b}
  4. {a, a.list, a.list[0], a.list[0].owner, b, b.other}
  5. {a.list, a.list[0], a.list[0].owner, b.other}

最后,你必须在一个列表的引用a ,它包含内部的一个或多个引用IB其中包含其拥有的参考b ,至极包含的参考a 当垃圾收集器将每个对象的引用计数加到该列表中时,如果这些计数等于实际引用计数(即,列表完全是自引用的),则可以将其全部删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM