この問題に 3 日間費やしましたが、私は困惑しています。
私のアプリは、フラグメント マネージャーを含む単一のアクティビティを使用します。現在の状態では、一度に 1 つのフラグメントのみがアタッチされるように設計されています。電話する:
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment, mCurrent).commit();
既存のフラグメントを削除し、新しいフラグメントに置き換えます。フラグメントは他の場所に保存されていません。(次のフラグメントが開かれたときに置き換えられる mCurrent とトランザクション マネージャーのみ)
発生する問題は OutOfMemory 例外ではなく、デバイス自体がメモリ不足になるため、アプリ全体が再起動します。ログには、DeadObjectException のようなもの以外は何も表示されません。
9-17 11:34:14.742: W/InputDispatcher(341): channel ~ Consumer closed input channel or an error occurred. events=0x9
09-17 11:34:14.742: E/InputDispatcher(341): channel ~ Channel is unrecoverably broken and will be disposed!
これらは、アプリのログではなく、デバイスのログからのものです。そして、何が原因かを追跡するのに十分な情報を提供してくれません。アプリのメモリが解放されることはなく、タブレットはその時点から使用できなくなります。
メモリリークが何であるかを分析するために利用できるすべてのツールを使用しましたが、何も目立ちません。MAT (MemoryAnalyzerTool) と Eclipse DDMS ツールを使用して、何が問題なのかを突き止めました。多くの異なるフラグメントにアクセスした後、MAT は 8MB ~ 16MB の合計メモリ使用量をレポートします。Leaks Report を見ると、異常はないように思えます。Imageviews で約 3MB、Bitmaps で 3MB、その他で 8MB です。DDMS では、アプリの割り当てサイズの約 50% を使用しているとヒープに表示されます。実行中のプロセスの設定を見ると、アクセスするフラグメントごとにアプリのメモリ量が 30 ~ 140MB の間で変動しますが、デバイス自体のメモリが減少することはないため、デバイスのメモリが不足します。アプリを完全に閉じたり、終了したり、破棄したりしても、メモリが解放されることはありません。
私の推測では、メモリ内のフラグメント自体を保持しているか、アプリがそうでなくてもこれらのフラグメント内に含まれている何かを保持していると考えられます。フラグメントをスワップするたびに GC を呼び出します。
Samsung Galaxy Tab 2 10.1" を使用していますが、Motorola Xoom でも同じ問題が発生します。
質問:
- この種の行動を経験した人はいますか?
- メモリリークの可能性を調査するのに役立つ他のツールについて、誰かが私に指示を与えることができますか?
- デバイス メモリがどのように割り当てられているかを詳細に確認できるシステム プロセスはありますか?
御時間ありがとうございます。