2011-10-01 3 views
11

私はちょうどgoogle ioのビデオ "アンドロイドのためのメモリ管理"を見ました。スライドはhttp://dubroy.com/memory_management_for_android_apps.pdfから入手できます。メモリリークの例は、スライド36にあります。Google I/OのAndroidメモリリークの例

これは、方向変更後にリークが発生する理由はわかりません。私はリークが内部クラスであり、外部クラスへの参照を持っていることを理解しています。また、静的変数 "leak"が "Leaky"オブジェクトを参照していることを理解しています。私はそれが静的なキーワードのために特別だと思う。静的変数には一定のメモリがあり、少なくともアプリケーションが実行されている間はgc'edされませんか?

さて、オーランドの変更はどうなりますか?新しいアクティビティインスタンスが作成され、アクティビティonCreateが呼び出されます。 leak == nullはfalseです。 Leakは "古い"活動を指しています。それはリークです。古い活動はできません。

すべてのバージョンが変更されると、メモリ使用量が増加するのはなぜですか?私の(間違った)理解では、最初のアクティビティだけがgc'edできないと思います。 orantationの変更のために作成された他のアクティビティは、その静的変数 "leak"によって参照されないため、gc'edできます。

しかし、明らかに..私は完全に間違っています!

+0

これは役に立ちましたか?受け入れは素敵でしょう:) –

+0

あなたは活動の破壊==ガベージコレクションだと思います。私は何が起こっているのかを説明しようとする答えを加えました。基本的には、新しく作成されたアクティビティではリークが== nullになるからです。なぜ、私の答えを読んでください。 – iheanyi

答えて

2

オリエンテーション変更の古典的な説明コンテキストメモリリークGoogle blogから。あなたはそこの方法の大部分を占めていたと私は考えています。

+0

はい、私は以前それを読んでいました。それは実際に同じで、作者は「それが最初の活動を漏らす」と言っています。それは私が上で説明した行動です。最初の活動が漏れていることは私には明らかです。しかし、最初のものだけ。それ以降の方向変更は、それぞれヒープに影響を与える/増やすべきではなく、もはやリークが発生する必要はありません。しかし、私がアップロードしたビデオでは、ヒープが9mbから12mbから15mbまでのすべてのorantationの変更(分28から開始)で増加するようです。さて、私はこれを少し試してみるつもりです – 207

+0

私が理解しているのは、オリエンテーションを変更するたびに活動が失われますが、GCdを取得しないということです。あなたがランドスケープに切り替えられた肖像画に戻ったとき、あなたは最初の文脈を取得しません。 –

+0

はい、あなたは初期コンテキストを取得していません。しかし、なぜ毎回?静的変数は最初のアクティビティのみを参照します – 207

1

致命的なエラーが発生したため、理解できません。リーク==新しく作成されたアクティビティではnullがtrueです。リークは "古い"活動を指していません。

なぜですか?私はリークが静かだと思った。まあ。 。 。

最初にアクティビティが作成され、リークがnullの場合、onCreate()およびリークがリークオブジェクトを参照するようになりました。そのアクティビティのインスタンスをさらに作成すると、それらのリークはnullでなくなり、同じオブジェクトを参照します。

しかし、向きを反転すると、アクティビティが破棄されるということが起こります。したがって、アクティビティオブジェクトの既存のインスタンスは存在しません。 Androidは、リークがnullの新しいアクティビティを作成します(Androidに関する限り、アクティビティの他のインスタンスは存在しないため)。

しかし、ガベージコレクタには、誰かが破壊されたアクティビティ、つまり内部のLeakyクラスへの参照を保持しています。それで、その記憶を解放しません。したがって、あなたがオリエンテーションを変え続けると、あなたは記憶の価値ある活動を漏らし続けます。