我最近讀了一些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