2

私は現在、いくつかのアクティビティを備えた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いつかスローされなければならないので、私の分析で何かが間違っているに違いないと思います:/

4

2 に答える 2

0

さて、私はこれを見つけて、停止したアクティビティ (およびそのオブジェクト) がバックスタックにある限り破棄されないことに気付きました。アクティブなものがより多くのメモリを必要としている場合でも。この知識があれば、ImageButton のようなこれらのオブジェクトがまだヒープにある理由は明らかです。

これらのリソースを解放する最善の方法をまだ見つけ出さなければなりませんが、これはアプリケーション自体に大きく依存しているため、一般的に答えるのは難しいと思います。

于 2013-03-01T22:54:36.120 に答える