2009-10-05 12 views
22

私はJavascriptにガベージコレクタがあることを知っています。したがって、を削除を使用すると、オブジェクトへの参照のみが削除され、このオブジェクトへの参照がなくなると、GCによって削除されます。Javascriptのメモリ管理の落とし穴?

クロージャ、ファジィネームスペース、プロトタイプ継承を使用すると、Javascriptは扱いにくいですが、いつ、いつ、いつ、なぜそれがいつ分かるのかは分かりません。

私は非常に大きなJavascriptプロジェクトをコーディングしており、グローバルメモリの使用を制限しながらメモリリークを避けたいと考えています。私は最適化の段階では何​​もしていません(最初に作業を始めましょう:-))。しかし、厄介なコードを書くのを避けるために、メモリ管理の良い慣行を知っているといいでしょう。

  • したがって、を削除する場合は、を削除する必要がありますか?
  • 私は避けるべきトラップは何ですか、 オブジェクトを使用していますか?
  • クロージャについて知っておくべきことはいくつかありますか?
  • ハイライトすべきいくつかの良い方法はありますか?
+0

「今すぐ**または**いつにするのか」を知っているかもしれないタイプミスはありますか?私は英語のこのビットを解析することはできません... – hippietrail

+0

私は自分自身を理解することができません。たぶん私は酔っていた、または私はちょうど私がそれを書いたときに目を覚ました。または両方。ただ無視する。 –

答えて

3

私はDOMノードにデータを格納することで、すべてのブラウザで対処できる循環参照を簡単に作成できると思います。たとえば:あなたはそれが添付イベントリスナーを持っていた場合、それはのremoveChildを用いて除去した後、IEで

this.element = document.getElementById('something'); 
this.element.attachedObject = this; 
5
  • 、少なくとも古いバージョンでは、DOM要素をメモリに保持しました。メモリから削除する唯一の方法は、DOMからイベントを削除する前にイベントを切り離すことでした。
  • 要素を頻繁に作成したり削除したりしない限り、これについて心配する必要はありません。アプリケーションの起動時にたくさんの要素を作成するが、その後に新しいオブジェクトを作成しない場合は、メモリリークについてあまり心配しないでください。
10

私の経験から、ガベージコレクタは、ブラウザによってうまく実装されているか、実装が不良です。優れたオブジェクト指向のプログラミング手法を適用するのは良いスタートです。

私の唯一のアドバイス:(DOMとJSのGCによってクリアされることはありません循環参照を)オブジェクトのjavascript DOM &を接続することにより、メモリリークを作成しないでください。これらの間違いは、アプリケーション内でインスタンス化するオブジェクトよりもはるかに多くのメモリを消費します。

DOM/JSメモリリークの詳細。 http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+1

DOMをjsオブジェクトと接続することに同意することは私が知っている最大の問題です。ほとんどのブラウザでは、それぞれDOMオブジェクトとJSオブジェクトのメモリヒープが異なると考えられます。そのため、メモリリークが発生することがよくあります。もう一つの有用なリンク:http://www.ibm.com/developerworks/web/library/wa-memleak/ – Vojta