私の Android アプリケーションは基本的にフォアグラウンド サービスです。アプリケーションのユーザー インターフェイスの側面は、このフォアグラウンド サービスの設定と構成のためのものです。
アプリケーション UI からサービスを開始すると、23 MB のメモリ使用量が表示され始めます。
Android がサービスを開始すると (起動時など)、7 MB のメモリ使用量が表示され始めます。アプリケーション UI を開くと、メモリ使用量が 23 MB に増加します。
UI の MainActivity で onDestroy() が呼び出されると、関連するドローアブルとリソースはフォアグラウンド サービスに接続されたメモリに残り、ガベージ コレクションは行われません。
System.exit(0)
MainActivity の onDestroy() を呼び出すことで、問題を「解決」できます。その後、Android は 7 MB でフォアグラウンド サービスを再起動します。
さらに、マニフェストでタグを使用しandroid:process
て、UI 要素とサービス要素を分離できます。
上記の「解決策」はどちらも実際の問題に対処していませんが、あなたの助けを借りて解決したいと思っています!
Eclipse 経由で MAT ツールを使用すると、さまざまなオブジェクトがメモリに保持されていることがわかります。サイズが大きいのは次の 2 つだけです。
Class Name | Shallow Heap | Retained Heap Percentage
class android.content.res.Resources @ 0x40ef7910 System Class| 40 | 8,475,664 | 68.71%
android.graphics.drawable.BitmapDrawable$BitmapState @ 0x411beb20| 40 | 1,127,720 | 9.14%
gc ルートへのパスを調べても、これらがメモリに残っている理由や、何がそれらへの参照を保持しているのかについての手がかりは得られません。
MainActivity.this
使用しているコンテキストを試し、getApplicationContext()
静的変数への参照を削除しましたが、これらのメモリ オブジェクトを取り除くことはできません。
どんな助けでも大歓迎です。
編集: 弱い参照を除く gc ルートへのパス:
Class Name | Shallow Heap | Retained Heap
class android.content.res.Resources @ 0x40ef7910 System Class| 40 | 8,475,664
Class Name | Shallow Heap Retained Heap
android.graphics.drawable.BitmapDrawable$BitmapState @ 0x411beb20| 40 | 1,127,720
Class Name | Shallow Heap | Retained Heap**
[224] java.lang.Object[510] @ 0x41843738| 2,056 | 8,466,904
mValues android.util.LongSparseArray @ 0x40f46b28| 24 | 8,471,024
sPreloadedDrawables class android.content.res.Resources @ 0x40ef7910 SystemClass| 40 | 8,475,664
Found 1 path. No more paths left - for both entries.