0

反対派へ:私の質問は一般化されているので、私はコードを貼り付けていません。誰かがそれを要求したらすぐにいくつか投稿します。

私のアプリケーションでは、JSONArrayアクティビティの開始時に非常に大きな形式でユーザーのプレイリストをロードし、このデータを解析してに表示しますListView。ユーザーが[更新]ボタンを押すと、操作全体が繰り返され、同じオブジェクトが上書きされます。アプリが使用するRAMの量は、更新のたびに0.4〜1MBの間でランダムに増加することに気づきました。理由を理解しようとしていますが、同じメモリアドレスが新しいデータで上書きされるだけですが、RAMの消費量が増えるのはなぜですか?また、更新を行う前に、使用されているすべてのオブジェクトをに設定しようとしましnullた。これにより、使用されるRAMの量は減少しましたが、約100KBしか減少しませんでした。

上書きされるだけの同じ変数があるので、その問題の説明はありません。サーバー応答のサイズは変更されていません。 このメモリリークを修正する方法はありますか?

4

1 に答える 1

1

同じメモリアドレスが上書きされないためです。新しいメモリを使用する新しいオブジェクトを作成している場合、古いオブジェクトがガベージコレクションされるまで、両方のコピーが残ります。アプリ内のどこにも古いデータへのぶら下がっている参照がないことを確認するか(明示的にnullに設定することにより)、またはSystem.gcを呼び出すことによって(ただし、大きなマイナスのペナルティがあります)、これを高速化できます。しかし、そのような状況で成長することが期待されています。発生してはならないのは、結果を数回取得した後にhprofを実行した場合、配列のインスタンスの総数が無制限に増加することは決してないということです。もしそうなら、あなたは所有者の連鎖を追跡し、誰がまだぶら下がっているのかを確認する必要があります。

于 2013-03-04T21:09:45.317 に答える