1

私が開発している Android アプリケーションで、奇妙なメモリ動作が発生します。アプリケーションは正常に動作していますが、Samsung SII タスク マネージャーや Nexus 7 の「メモリ使用量」アプリケーションなど、Android の「タスク マネージャー」を見ると、アプリの使用中にメモリの使用量が急激に増加していることがわかります数百メガ (Nexus 7 では 600 ~ 700MB) のように、途方もない量にまで成長します。その後、約 200MB に戻ったり、再び大きくなったりする可能性があります。

最初は、メモリ リークが悪いと思い、この優れたビデオで説明されているように、Eclipse メモリ アナライザー (MAT) で問題を探し始めました。しかし問題は、ここから見るとすべて問題ないように見えることです。アクティビティの重複したインスタンスや、リークの原因となる可能性のあるものは見つかりませんでした。報告されたメモリ使用量ははるかに少なくなっています。この問題は、GC メッセージにも表示されません。そのため、タスク マネージャーで 600MB の使用を報告し、Logcat で次のように表示できます。

01-29 12:05:44.511: D/dalvikvm(6044): GC_FOR_ALLOC freed 3930K, 24% free 28959K/38096K, paused 17ms, total 17ms

ヒープ量が 50 ~ 60MB を超えることはありません (アプリにはたくさんの画像があるため、これは正常な場合があります)。MAT マッチの数字。

アプリケーションにメモリ リークがあるかどうかを確認したいと思います。GC メッセージと MAT が問題を報告しないとしても、タスク マネージャがこのように高いメモリ使用量を報告するのは非常に奇妙です。もしかしたら、ここにいる誰かがすでにそのような奇妙な行動に直面しており、何が起こっているのかについての手がかりを教えてくれるでしょうか?

4

2 に答える 2

1

わかりました、何時間ものテストの後、私はついに問題を発見しました. fadden が推測したように、リークは Dalvik の範囲外でした。実際には、Typeface.createFromAssetの次のバグが原因でした:

http://code.google.com/p/android/issues/detail?id=9904

このメソッドはアセット ストリームをリークしています。私のアプリは、カスタム TextView を使用してカスタム フォントでテキストを表示しています。ほとんどのレイアウト ファイルで使用されているため、大量の RAM が急速にリークしていましたが、Dalvik のヒープではリークしていませんでした。ツール。

于 2013-01-30T00:22:55.143 に答える
1

GC メッセージは、Dalvik ヒープにあるもののみを表示します。ネイティブ ヒープは際限なく大きくなる可能性があります。システムがユーザーを強制終了することを決定するまでは。あなたのアプリには、割り当てを引き起こす可能性のあるネイティブ コンポーネントがありますか?

これが開発者/ルート化されたデバイスの場合、「procrank」ツールを使用すると、メモリ使用量の概要を簡単に確認できます。「showmap」ツールを使用すると、より詳細な内訳を表示できます。

DDMS には、ネイティブ メモリの使用状況を調べるための (公式にはサポートされていない) ツールがいくつかあります。「ddms ネイティブ ヒープ」を Google で検索して、いくつかの手順を見つけてください。

于 2013-01-29T19:30:43.067 に答える