1. ホーム
  2. android

[解決済み] Androidアプリのメモリ不足の問題 - いろいろ試したが解決しない

2023-03-09 10:15:08

質問

開発中のアプリのメモリ リークを解明するために丸 4 日を費やしましたが、ずっと前から意味がわからなくなっています。

私が開発しているアプリはソーシャルな性質のもので、プロファイルの活動 (P) とデータ付きのリスト活動、たとえばバッジ (B) を考えています。プロフィールからバッジのリスト、他のプロフィール、他のリストなどへホップできます。

つまり、P1 -> B1 -> P2 -> B2 -> P3 -> B3, などのフローを想像してください。一貫性を保つために、同じユーザーのプロファイルとバッジを読み込んでいるので、各Pページは同じであり、各Bページも同じです。

問題の一般的な要点は、少し移動した後、各ページのサイズに応じて、ビットマップ、文字列などのランダムな場所でメモリ不足の例外が発生し、それは一貫していないようです。

なぜメモリ不足になるのか、考えられることをすべて行った後、何も思いつきませんでした。私が理解していないのは、ロード時にメモリ不足になり、クラッシュした場合に、なぜ Android が P1、B1 などを停止しないのかということです。私は、これらの以前のアクティビティが死んで、onCreate() および onRestoreInstanceState() を介してそれらに戻る場合、復活することを期待します。

P1 -> B1 -> Back -> B1 -> Back -> B1 を実行しても、クラッシュが発生します。これは、ある種のメモリ リークを示しますが、hprof をダンプし、MAT と JProfiler を使用した後でも、それを突き止めることはできません。

私は Web からの画像のロードを無効にし (それを補うためにロードされるテスト データを増やして、テストを公正なものにしました)、画像キャッシュが SoftReferences を使用することを確認しました。Android は実際に、持っているわずかな SoftReferences を解放しようとしますが、メモリ不足でクラッシュする直前です。

Badge ページは Web からデータを取得し、BaseAdapter から EntityData の配列にロードして ListView に供給します (実際には CommonsWare の 優れた MergeAdapter を使用していますが、この Badge 活動では、実際にはいずれにせよ 1 つのアダプタしかありませんが、いずれにせよこの事実を言及したいと思いました)。

コードを調べてみましたが、リークするようなものは見つかりませんでした。見つけられたものすべてをクリアして null にし、System.gc() でさえ右往左往しましたが、それでもアプリはクラッシュします。

スタック上にある非アクティブなアクティビティが刈り取られない理由をまだ理解しておらず、それを理解するのが本当に好きです。

この時点で、ヒント、アドバイス、解決策...何でもいいので、助けてくれるものを探しています。

ありがとうございました。

どのように解決するのですか?

そのひとつが 本当に は、Bitmap の inPurgeable を true に設定することでメモリの問題を解決することができました。以下を参照してください。 BitmapFactoryのinPurgeableオプションを使用しない理由は? とその答えのディスカッションを参照してください。

Dianne Hackborn の回答およびその後の議論 (CommonsWare にも感謝) によって、私が混乱していたいくつかの事柄が明確になりましたので、感謝します。