3

フォアグラウンドサービス、コンテンツプロバイダー、およびサービスにバインドしてAIDLを使用してオブジェクトのリストを取得するアクティビティフロントエンドを備えたアプリを作成しています。このサービスは機能し、データベースを更新します。

アクティビティを4〜8時間以上開いたままにして、電話(Nexus One)の設定の下にある[サービスの実行]セクションに移動すると、異常に大量のメモリが使用されていることが示されます(〜42MB)。

漏れがあると思います。ヒープメモリを確認すると、ヒープサイズが取得されます:〜18MB、〜2MBが割り当てられ、〜16MBが解放されます。Eclipse MATでhprofを分析することは問題ないように思われます。これにより、スタックでメモリがリークしていると理論化できます。これも可能ですか?もしそうなら、リークを停止または調査するために何ができますか?androidの「RunningServices」セクションで報告されたメモリ使用量は正しいですか(私はそうだと思います)?

別の注意:UIが起動していない場合(サービスのみが実行されている場合)、この問題を再現できませんでした

4

1 に答える 1

1

フォアグラウンドサービス、コンテンツプロバイダー、およびサービスにバインドしてAIDLを使用してオブジェクトのリストを取得するアクティビティフロントエンドを備えたアプリを作成しています。

それがすべて1つのアプリケーションである場合は、AIDLを削除し、コンテンツプロバイダーを削除します。または、少なくとも、自分で使用しないでください。他のアプリケーションで使用するためのものです。それらはあなたがあなた自身のVM内のもののために必要としないオーバーヘッドを追加します。

...これは、メモリがスタックでリークしているという理論につながります。これも可能ですか?

あまり。メインアプリケーションのスレッドスタックはごくわずかです。他のスレッドにはもっと大きくなる可能性のあるスタックがありますが、42MBをそのように噛んでいると驚かれることでしょう。

もしそうなら、リークを停止または調査するために何ができますか?

すでにUIをテストして問題がないと判断する「スパイクソリューション」を実行したので、UIをゆっくりと再導入し、問題が発生し始めた時期を確認します。問題となる可能性のある領域の1つは、バックグラウンドスレッドからアクティビティを更新することです。そのため、これをオフにして、何が起こるかを確認できます。

あなたの問題はヒープ自体にあるのではないので、私の推測では、あなたの問題はビットマップまたはヒープ外のRAM使用量が多い他のものに関連していると思います。アバターのカメラは、この方向のもう1つのヒントです。:-)recycle()ビットマップなどを使用していることを確認し、それが役立つかどうかを確認してください。

于 2010-05-07T19:54:33.433 に答える