2011-01-28 2 views
0

生き参照して下さい。メモリリークを追跡する方法 - UIアクティビティがサービスを起動し、二つが通信できるように、最大​​2つのウェイAIDLのコールバックを設定します</p> <p>- 私はかなり複雑なアプリを持っている

サービスは永遠に実行されます(UIアクティビティでヒット 'オフ'ボタンを使用しない限り)。

問題は、ユーザーがアクティビティを終了し、アクティビティメモリが解放されない場合です。 - UIアクティビティが閉じられていても、アプリで使用するメモリ量は同じです。 - UIアクティビティが閉じられていても、ヒープにはまだmapTilesやその他のUIが表示されます。

私の推測はどういうわけかサービスがアクティビティへの参照を保持しているからです。私は、Activity Contextの漏洩に関する多くの記事を知っています。サービスは、アプリケーションスコープに格納されている弱い参照を介してアクティビティのみを参照します。 (アプリケーションを拡張するクラス)

具体的にアクティビティを参照しているものを見つける方法はありますか?ドミネーターツリーは、すべての私の記憶を食べているmapTilesとListViewレイアウトを示しています...しかし、私はそのものを生かしているアクティビティへの参照を見つけることができません。

また、OutOfMemoryExceptionが発生した場合、HPROFヒープダンプの問題をダンプする方法はですか?

答えて

0

問題は、ユーザーが 活動を終了すると、アクティビティメモリが解放さ ではないです。

Androidには「exitアクティビティ」はありません。 finish()を呼び出すか、アクティビティを押しても、そのアクティビティが使用したメモリからオブジェクトは削除されません。 Androidは本質的に、将来、ある時点でこれを処理します。

あなたのオブジェクトが活動がを終えた瞬間にメモリから解放されたい場合は、手動で自分を解放する必要があります。

編集:メモリ使用量を見つけるために使用できるクラスはActivityManagerです。

+0

メニュー - >アプリケーション - >実行中のサービス。これはcom.myappが15MBを持っていることを示しています。私はアクティビティを終了して(後ろ向きの矢印)、電話でちょっと迷惑をかけると思いましたが、アクティビティはガベージコレクションされ、その数は減少します。それは決してしません。 – paulpooch

+0

その画面はサービス固有のものです。あなたの活動はサービスを開始しており、そのサービスはその15MBのメモリを使って見ているものです。このサービスは、アクティビティを終了しても停止しません。 OSによって処理され、必要に応じて停止されます。私は例えば、現在、48時間以上稼働しているサービスを持っています...最後に私は電話を再起動しました。あなたのサービスコードの中で、あなたが望むようにこのサービスを停止/開始することを選択することができます。 – user432209

+0

Ok - 画面はサービスクラスに固有のものであることを知っておきましょう。タスクマネージャはありますか?アクティビティがどれくらいのRAMを使用しているかをどのように知ることができますか? – paulpooch

0

参照を保持しているのは自分自身ではない場合(「アプリケーションスコープに格納された弱い参照を使用してアクティビティを参照する」の場合はnullですか?あなたはGCを実行しようとしましたか?十分なメモリが残っている限り、ごみを移動させるためのgcは実行されません。

+0

、WeakReference.clear()を呼び出してアクティビティ参照がなくなったことを確認します。それは電子メールアプリであるとふりまとめてください...サービスはサーバーをポーリングし、新しい電子メールでローカルDBを更新しています。次に、「UIアクティビティ参照がnullでない場合は、新しいメッセージを表示するように教えてください」と言います。 – paulpooch

関連する問題