我最近读了一些SO帖子/答案,建议使用匿名类可能会导致内存泄漏。如果我理解正确,如果匿名类的对象引用泄漏到封闭类之外,那可能会导致匿名类实例变得无法收集。这是否会导致内存泄漏?
为了确保我的理解正确,我是否正确地说下面的示例代码不会导致内存泄漏?
public class EnclosingClass {
private AnonymousClassBase anonymous;
public void startDoingSomething() {
this.anonymous = new AnonymousClassBase() {
@Override public void anonymouslyDoSomething() {
EnclosingClass.this.doSomething("Did something anonymously!");
}
};
this.anonymous.anonymouslyDoSomething();
}
private void doSomething(final String something) {
System.out.println(something);
}
}
public abstract class AnonymousClassBase {
public abstract void anonymouslyDoSomething();
}
public class MainClass {
private final EnclosingClass enclosing = new EnclosingClass();
// Some kind of button click event handler
public void onButtonClicked() {
this.enclosing.startDoingSomething();
}
}
私人领域anonymous
只能存储AnonymousClassBase
一个实例,因此调用startDoingSomething()
第二次将导致封闭类失去一审参考。此时,是否有资格进行垃圾回收?
当你用匿名共享你的类变量时发生内存泄漏(并且在使用后不要将它们取消设置) – FieryCat
嗯,我在匿名类中添加了'private double [] memoryLoad = new double [9999999];'看起来像我的机器上的JVM在内存消耗达到2.9GB之后做垃圾回收。所以看起来好像我回答了我自己的问题...... – Jai
好的问题已经是答案的一半:) – FieryCat