私は現在、いくつかのアクティビティを備えたAndroidアプリに取り組んでいます。ほとんどの場合、アプリは正常に動作しますが、時々Out of Memory Exception
発生します。(通常、次のアクティビティのために大きな背景画像を読み込もうとするとき)
明らかなメモリ リークを見つけることができなかったので、例外が発生したときにヒープ ダンプを作成し (ここで説明したように)、MAT で分析しようとしました。私は以前にこのようなことをしたことがないので、正確に何を探すべきかわかりませんでした. 大きなバイト オブジェクトをクリックし始めたところ、2 番目のオブジェクトは次のオブジェクトに属するビットマップのようですImageButton
。
GC ルートへのパスは、com.android.internal.policy.impl.PhoneWindow インスタンスを示しています。
ImageButton
問題は、私のアプリケーション全体で唯一の起動アクティビティであり、その起動アクティビティとクラッシュ アクティビティの間に少なくとも 2 つのアクティビティがあります。
では、なぜこの画像がまだヒープにあるのでしょうか?? これImageButton
は、android:src 属性を使用してレイアウト xml ファイルで定義されているだけで、そこでコードを介して何も行われません。ヒープには、以前のアクティビティからの他の多くの小さなオブジェクトもあります。
また、小さな HelloWorld アプリケーションを作成し、そのヒープ ダンプを調べたところ、Android は以前のアクティビティのオブジェクトをヒープに保持しているようです。これが事実である場合、Out of Memory Exception
いつかスローされなければならないので、私の分析で何かが間違っているに違いないと思います:/