私は地図活動を扱うプロジェクトに取り組んでいます。私は、MapActivity を拡張し、他に何もしない単一のアクティビティ MaptestActivity で構成されるテスト アプリを実行していました。デバイスを 10 回以上ローテーションし、ヒープ ダンプを MAT で分析しました。メイン アクティビティのインスタンスが 2 つ存在することに気付きました (リーク?)。アクティビティのみを拡張する同じアクティビティでアプリを再テストしました。ダンプは、システムによって保持されているインスタンスが 1 つだけであることを示していました。現在のインスタンスです。両方のケースのスクリーンショットを添付しています。私はMATにはあまり興味がありません.結果を誤解しているだけで、すべてうまくいきます. 少し光を当てていただけますか?
2 に答える
デバイスをローテーションした後もメモリに 2 つのアクティビティが残っている場合は、メモリ リークが発生しています。MAT を使用して、ヒストグラムを使用することで、そのアクティビティがガベージ コレクションを妨げている原因を確認できます。クラス名を検索して見つけます。次に、それを右クリックして、リストオブジェクト/受信参照を選択します。これにより、メモリ内でこのオブジェクトが出現するたびに一覧表示されます。これらのオブジェクトの 1 つを右クリックし、GC ルートへのパス/弱い参照を除外を選択します。これで、アクティビティの onDestroy が終了した後、何かが完全にクリーンアップされていないオブジェクトの階層を確認できるはずです。静的コンテキストへのハード参照などにより、これが発生します。必要に応じてweakReferencesを使用するなど、いくつかのメモリの問題を解決する必要がありました。
通常、アクティビティがビットマップなどの大きなオブジェクトを保持していない場合、デバイスのアプリケーション ヒープ サイズを超える前に多くのアプリを使用することになるため、メモリ リークを「回避」できます。しかし、すべてのアクティビティが大きなビットマップに保持されているとしたら、アクティビティのリークははるかに大きな問題になります。
これは良いビデオです: Android アプリのメモリ管理と 良い記事:メモリ リークの回避
マニフェスト ファイルのアクティビティに以下の行を追加します
android:configChanges="keyboardHidden|orientation"