2012-05-07 35 views
8

何かに割り当てることなくオブジェクトを作成すると、いつJavascriptがこのオブジェクトをガベージコレクションしますか?ここに例があります:匿名オブジェクトはどのようにガベージコレクションされますか?

このようなガベージコレクションが行われていない場合、メモリリークが発生しますか?

for (var i = 0; i < 99999999; i++) { 
    console.info(new Date().getTime()); 
} 
+0

は、あなたが問題を持っていますか? –

+1

あなたの質問への直接的な回答(「オブジェクトは参照されなくなった後でいつでも収集されます」および「いいえ、漏れは発生しません」)は、おそらくあなたが実際に探しているものではありません。何を本当に知りたかったのですか? – Phrogz

+2

@AshBurlaczenkoとPhrogz - 私は何かこの種のことについて尋ねると間違っているとは思わない。おそらくメモリ使用量を減らすためにコードを最適化しようとしているなら、これは非常に良いことですが、特定の問題に縛られる必要はありません。 – nickf

答えて

7

スコープ内の誰も匿名オブジェクトを参照していない場合、次回GCを実行したときにガベージコレクションが行われます。

したがって、Console.infoの実行が終了すると、ガーベジコレクションが実行されます。スコープ内の変数を参照するように変数を設定すると、スコープ内の変数は参照されません。

4

ガベージコレクションの美しさは、あなたが(それはあまりにも頻繁に起こっていない限り)、メモリが再利用され、また、あなたが気にしなければならないときは知らないということです。

この状況では、ランタイムは最終的にこれらのDateインスタンスを再利用する必要がありますが、実際にはそれを実行する速さを変更することは実際にはありません。また、これはメモリリークを引き起こしません。

4

JavaScriptは、GC(ガベージコレクタ)を自動的に実行して、使用されていない文字列、オブジェクト、配列、関数が占有するメモリを自動的に再利用します。

ガベージコレクションの主な特徴は、ガーベッジコレクタがメモリの再利用が安全かどうかを判断できることです。当然のことながら、それはまだ使用中の値を再利用してはならず、到達することのできない値だけを に集める必要があります。つまり、プログラム内の変数、オブジェクトプロパティ、または 配列要素のいずれかを使用して、 を参照できない値。

参考:Here.

関連する問題