私は最近、匿名クラスを使用してメモリリークを引き起こす可能性があると思われる投稿/回答を読んでいます。私が正しく理解していれば、匿名クラスのオブジェクト参照が囲むクラス外に漏れると、その匿名クラスインスタンスがガベージコレクション不可能になる可能性があります。これはメモリリークを引き起こしますか?
ちょうど私が正しく理解したことを確認するために、以下のサンプルコードがメモリリークを引き起こさないと言ってもいいですか?
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
はだけなのでstartDoingSomething()
囲むクラスは、最初のインスタンスの参照を失うことになります二度目の呼び出し、AnonymousClassBase
の1つのインスタンスを格納することができます。この時点で、最初のインスタンスはガベージコレクションの対象ですか?
クラス変数を匿名で共有しているときにメモリリークが発生します(使用後に解除しないでください) – FieryCat
匿名クラスに 'private double [] memoryLoad = new double [9999999];を追加しましたメモリ消費量が2.9GBに達した後、私のマシン上のJVMがガベージコレクトをしたようです。だから私は自分の質問に答えたようだ... – Jai
よく形成された質問はすでに回答の半分です:) – FieryCat