2016-10-10 23 views
2

内部クラス内のメモリリークの概念を把握することはかなり困難です。私が見つけた答えのほとんどは、javaの文脈の中にあり、私のような初心者をさらに混乱させます。これにリダイレクトされ、ここで同様の質問へJavaでネストされたクラスのメモリリークを見つけて修正する方法

ほとんどの答え:When Exactly is it leak safe to use anonymous inner classes?

は再び、ここに答えがOOPにかなり新しい誰かのために全体を取得することが困難でした。

私の質問(複数可):

  1. なぜメモリリークが内部クラスで発生しますか?

  2. 内部クラスを使用する場合、 が発生する最も一般的なメモリリークは何ですか?

  3. によく出るメモリリークの救済策は何ですか?メモリリークは、内部クラスでは発生しないのはなぜ

答えて

2

内部クラスが外部クラスへの参照を保持するためです。

内部クラスが匿名クラスに共通の静かで、そして外側のクラスがそう到達不能である参照実際必要を、しない場合、それが原因で、その参照のそれにもかかわらず、ゴミ回収可能ではありません。

「リーク」とみなされます。つまり、内部クラスへの参照が維持されている限り、解放する必要があるメモリは解放されていません。

内部クラスを使用する場合、最も一般的なメモリリークは何ですか?

最初の質問への回答を参照してください。

頻繁に起こるメモリリークの救済策は何ですか?

匿名、ローカル、およびインナークラスの代わりに静的ネストされたクラスを使用します。もちろん、トップレベルのクラスもオプションです。

これはもちろん、内部クラスの有効期間が外部クラスの有効期間を超えている場合にのみ必要です。

+0

私は静的な内部クラスを使用する場合、私は外部クラスの非静的なフィールドにアクセスできません。そして、それらの外部クラスのフィールドは最終的なものである必要があります。 – Shehryar

+0

内部クラスが本当に外側のクラスのすべての(またはほとんどの)フィールドを必要とする場合は、実際にそのメモリが必要なため、メモリリークはありません。 – Andreas

関連する問題