4

Elipse メモリ分析ツール (DDMS ビュー) で確認できるヒープ使用量 (割り当て済み) と、Android デバイスでここに表示されている同じアプリのメモリ使用量の違いは何ですか?:

設定->アプリ->実行中

オブジェクトが不要になるとすぐにオブジェクトを null にすることで積極的にメモリを保持しようとしましたが、後者の数値 (実行中のアプリ画面のメモリ使用量) は増加し続け、最終的に OutOfMemoryError が原因でアプリがクラッシュしました。しかし、前者は私が妥当なサイズの範囲内にあることを示しました. System.gc() もたくさん呼び出していました。両者に違いはありますか?なぜ不一致なのですか?この問題を解決する方法についてのアイデアはありますか?

4

2 に答える 2

1

私が知っている 2 つの最大の違いは、ガベージ コレクションの範囲です。

を含む通常のガベージ コレクションSystem.gc()は、少しのガベージを収集してから停止します。すべてを取り除くためにヒープを完全に一掃するわけではありません。これは、ガベージ コレクションの CPU への影響を最小限に抑えようとすることです。

ただし、MAT 用に準備されたヒープ ダンプは、事実上完全な GC です。

あなたの症状は、GC がメモリを再利用できるよりも速くメモリを割り当てていることを示しています。これに対する主な解決策は、メモリの割り当てを減らすか、割り当てる頻度を減らすことです。たとえば、可能であれば、GC に古いものを消去させて新しいものを割り当てようとする代わりに、オブジェクト、ビットマップ バッファなどを再利用します。

于 2012-11-23T16:52:49.007 に答える
0

メモリが解放されない場合は、アプリケーションのどこかでメモリリークが発生しているようです。これは、再作成されている大きなオブジェクト(アクティビティやビットマップなど)への強力な参照をどこかで維持していることを意味します。そのため、System.gc()を呼び出しても違いはありません。

google IO 2011のAndroidでのメモリ管理について、以下をご覧になることをお勧めします。この種のエラーのデバッグに非常に役立つEclipseメモリアナライザツールの使用方法を知ることができます。

于 2012-11-23T17:00:43.683 に答える