開発中のアプリのメモリリークを把握するために4日間かけてすべてのことを試してみましたが、物事はずっと前に意味をなさなくなりました。
私が開発しているアプリはソーシャルな性質のものなので、アクティビティー(P)をプロファイルし、アクティビティーをデータ付きでリストします(例:バッジ(B))。プロファイルからバッジリスト、他のプロファイル、他のリストなどに移動できます。
したがって、このようなフローを想像してみてください。P1-> B1-> P2-> B2-> P3-> B3など。各Bページ。
問題の概要は次のとおりです。各ページのサイズに応じて少しナビゲートした後、ランダムな場所(ビットマップ、文字列など)でメモリ不足の例外が発生し、一貫性がないようです。
なぜ私がメモリ不足に陥っているのかを理解するために考えられるすべてのことをした後、私は何も思いつきませんでした。理解できないのは、AndroidがP1、B1などをロード時にメモリ不足でクラッシュしてクラッシュした場合に、P1、B1などを強制終了しない理由です。onCreate()およびonRestoreInstanceState()を介してこれらに戻ると、これらの以前のアクティビティが終了し、復活することを期待します。
これは言うまでもなく、P1-> B1->戻る-> B1->戻る-> B1を実行しても、クラッシュが発生します。これはある種のメモリリークを示していますが、hprofをダンプしてMATおよびJProfilerを使用した後でも、正確に特定することはできません。
Webからの画像の読み込みを無効にし(そして、それを補ってテストを公正にするために読み込まれるテストデータを増やしました)、画像キャッシュがSoftReferencesを使用することを確認しました。Androidは実際にはいくつかのSoftReferencesを解放しようとしますが、メモリ不足になる直前です。
バッジページはWebからデータを取得し、BaseAdapterからEntityDataの配列にロードして、それをListViewにフィードします(私は実際にはCommonsWareの優れたMergeAdapterを使用していますが、このバッジアクティビティでは、とにかく1 つしかアダプターがありませんが、いずれにせよこの事実に言及したかった)。
私はコードを調べましたが、リークするものを見つけることができませんでした。見つけることができるすべてのものをクリアしてnullにし、System.gc()でさえ左右に移動しましたが、それでもアプリがクラッシュします。
スタック上にある非アクティブなアクティビティが取得されない理由はまだわかりません。それを理解したいのですが。
この時点で、ヒント、アドバイス、解決策など、役立つものを探しています。
ありがとうございました。
outOfMemory
エラー。ありがとう!