2

Javascript コードでメモリ リークが発生しているように見えるインスタンスがいくつかありますが、ガベージ コレクターに何を期待すべきかわかりません。

たとえばvar = new Object()、Firefox で実行されているインターバル タイマー関数では、時間の経過とともにリークするように見えます。いくつかの簡単な解決策がありますが、ガベージ コレクターがすべてを処理することを期待すべきなのか、それともガベージ コレクターを支援する責任があるのか​​ 知りたいです。

ガベージコレクターを助ける必要がある場合、ルールは何ですか?

4

2 に答える 2

0

ほとんどの (すべてだと思います) Javascript (ECMAScript) エンジンは、「参照カウント」と呼ばれる方法で動作します。その用語をゴーグルするのはあなたに任せます。

要するに、オブジェクトは、何も指されていないときに解放されます...それを使用しています。

2 つのことが、メモリの使用量に対する感覚を狂わせる可能性があります。

1) ECMAScript は、システムが処理を終えた瞬間にオブジェクトを解放しません。ガベージ コレクションは「必要に応じて」実行されます。これは大きく異なる可能性があります。

2) クロージャーは、あなたが思っているよりも長く参照を保持することができます。偶発的な閉鎖は、予想よりも長く物事を保持する可能性があります。

于 2012-08-24T07:54:19.390 に答える
0

長さのコメントではなく、これを回答にする必要がありました。

OK -- まず用語の説明:

タイマーで実行されている場合、再帰的ではありません。しかし、それはよくある誤解です。

これは再帰的なコードであり、関数はそれ自体を呼び出します。元の関数呼び出しは、全体が最終的に巻き戻され、元の呼び出し元に値が返されるまでスタックに残ります。タイムアウトを使用する場合、関数の各反復は個別の実行コンテキストにあります。

再帰関数の例 function factorial(n) { if (n == 1) { return 1; } else { return n * factorial(n-1); } }

これは/再帰的ではありません: function annoy() { window.setTimeout(annoy, 1000); window.alert("これは毎秒イライラします!"); }

「迷惑」の各反復は完全に独立しており、独立しています。別のインスタンスが呼び出されるようにタイマーを設定するだけです。スタック上に「煩わしい」関数の山はなく、呼び出し元に何も返すことはできません。

第二に、私があなたに与えた例では、変数aは範囲外にはなりませんが、a参照する古いオブジェクトにはアクティブな参照がなかったので、自由に解放されます。変数が指すものはさまざまです。

var a, b;
a = {};
b = a;   // This object now has TWO references using it.

b = null;  // The object now has one reference
a = null;  // Object has no references and is free for release.

この時点で、私にできる最善のことは、次のことを示すことです。

http://www.ibm.com/developerworks/web/library/wa-sieve/

于 2012-08-26T19:27:28.203 に答える