5

数か月間、私は Android アプリを開発しておりPhoneGap 2.8、javascript 側で と をメイン フレームワークとして使用Backboneしています。jQueryアプリケーションが適切なサイズに成長するにつれて、かなりのメモリ消費に気付き始めました。実行するのにかなりの量のメモリが必要な理由を説明するさまざまな記事を読んだことPhoneGapがありますが、メモリの使用方法を最適化できると信じています。

BackBoneは、URI を特定の関数にマップする Router オブジェクトがあり、オブジェクトと呼ばれるものをレンダリングしViewます。ビューを作成してレンダリングするルーター機能を実装しただけでなく、現在表示されているビューへのグローバル参照も保存します。したがって、新しいビューを作成する前に、古いビューにクリーンアップを行うように指示します (ビューにはより多くの「サブ」ビューを含めることができるため、これは再帰的に行われます)。クリーンアップ中、私は現在ビューに彼のイベントの委任を解除するように伝えています (私は信頼しています)Backboneイベントリスナーを削除します)。現在、これ以上のことは行われていません。新しいビューがレンダリングされると、グローバル変数は新しいビューを参照します。javascript GC が古いビューで使用されていたメモリを解放すると信じています。残念ながら、これが起こっていることはありません。アプリ内をナビゲートすればするほど、より多くのメモリが消費されます。メモリリークが発生していることは承知していますが、何がメモリを消費するのかわかりません。私が疑っているのは、何らかの理由で古いオブジェクトが適切にガベージ コレクションされていないことです。あるコンテナーで新しい html (DOM) をレンダリングすると、古いDOMものがメモリ リークを引き起こしている可能性があり、イベント ハンドラーが不必要にどこかに保存されている可能性があります。

メモリが割り当てられている場所をデバッグ/トレース/測定する方法に関するツール、コマンド、またはヒントがある場合、私が知りたいこと。すべてのイベントリスナーにアクセスして何らかの方法で測定する方法はありますか (DOM の場合も同様)。スマート メモリ効率の高い技術に関する記事も歓迎します。現在、私ができる唯一のことは、オブジェクトのすべての属性を再帰的に削除することです(最終的にはオブジェクトも)、破棄しようとしています。

どんな提案でも大歓迎です!前もって感謝します。

4

1 に答える 1