私はこの昨日の終日と苦労していましたが、まだそれを理解できなかったので、私はその時を考えました。だから私は2つのアクティビティ、1つのタブごとに2つのリストビューをフラグメントとして持つアプリケーションを持っています。アンドロイド(2.3.3/2.2) - 外部割り当て/ GC出力とMAT分析
私は、オープン2つのエミュレータがあります。私は2.3.3エミュレータ上でそれを実行すると、1GBのSDカードと三星銀河
を:64 SDカード
と一つのデバイスで64 SDカード、2.2と2.3.3を: 私は最初のリストに移動し、それを下にスクロールします。すべての行はここで見つけることができますDrawableBackgroundDownloaderクラスを使用して、URLから遅延ロードされた画像があります。そして、私は2番目のリストに移動し、スクロールダウン開始
Lazy load of images in ListView
。 GCはすでに最初のリストに入っていますが、最初の項目が表示された後にエラーが表示されます。
これが出力され、それはエラーを示す開始したとき:
「ダウンロード画像は、」画像が述べたクラスのようにスレッドにダウンロードされていることを意味します。
私は、各リストは、約40の項目があり、両方のリストのためのすべてのイメージが完全に
2メガバイト
周りのヒープサイズは同じ〜3.5メガバイトをより少ないまましかし、あなたが見ることができるようにしたことを知っているので、私は画像を管理しています外部のalloc capが10MBから12MBに14244Kb、次に16291Kb、そして18328Kbにジャンプし、突然割り当てに失敗します。ここで何が起こっているか
これは2.3.3なので、ここではMATを使用してヒープダンプを分析します。 2.8MBしかありません。私は、ビットマップがヒープ(それへの参照のみ)ではないことを知っているので、そこのリークを分析するのは難しいです。私は2.2のデバイス上でそれを実行すると、とにかくエラー
上のヒープから
ヒストグラム(GCがそう言うと、エミュレータにはOOMEはありません)ヒープではなく、外部メモリを接続しているように見えるdoesntの - それは動作し、同じアクションはGCに外部割り当てが失敗する原因になりません。 は、しかし、正常に終了する第二のリストをスクロールした後、GCからのサンプルは以下のようになります。
03-16 15:30:25.440: D/dalvikvm(19622): GC_EXTERNAL_ALLOC freed 6910 objects/836600 bytes in 40ms
それはここにオブジェクトとして表現されているのはなぜ? 836600 =〜816kbそれはどういう意味ですか?
2.2エミュレータで実行すると、GCエラーも発生しますが、2.3.3の場合より少し遅れています。 私は、512のエミュレータでsdカードを変更することに違いがないと付け加えます。
イムまだアンドロイド、 に新しい私は、あなたがメモリリークを持っていて、使用していないすべての画像を再利用する必要がある任意のヒントを認めるか、私の推論