[解決済み] Androidアプリのメモリ不足の問題 - いろいろ試したが解決しない
質問
開発中のアプリのメモリ リークを解明するために丸 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 にも感謝) によって、私が混乱していたいくつかの事柄が明確になりましたので、感謝します。
関連
-
[解決済み] ViewPagerとフラグメント - フラグメントの状態を保存する正しい方法は何ですか?
-
[解決済み】アクティビティコンテキストまたはアプリケーションコンテキストを呼び出すタイミングは?
-
[解決済み】ログアウト時にアクティビティ履歴をクリアすると、「戻る」ボタンでログイン中のみのアクティビティを開けなくなる。
-
[解決済み] アンドロイドフラグメント onRestoreInstanceState
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] google-services.jsonって実際何してるの?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] バイト配列の画像ファイルをビットマップに変換するには?
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] XMLで矩形を描画できますか?
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] フラグメント間の値の受け渡し方法
-
[解決済み] ViewPager2でスワイプを無効にするには?
-
[解決済み] アンドロイドボタンセレクター