web-dev-qa-db-ja.com

JavaScriptでガベージコレクションはどのように機能しますか?

JavaScriptでガベージコレクションはどのように機能しますか? .NETガベージコレクションに似ていますか?そして、VBScriptでのガベージコレクションの実装が悪いため、人々はそれを避け、標準のクライアント側言語としてJavaScriptの設定を確立しましたか?

29
Ali Tarhini

ガベージコレクションはどのように機能しますか?

簡単な答えは次のとおりです。メモリのブロック(たとえば、オブジェクト)に到達できなくなった場合、それは再利用される資格があります。いつ、どのように、またはそれが再利用されるかどうかは完全に実装次第であり、実装が異なればそれも異なります。しかし、言語レベルでは、それは自動的です。

例えば:

function foo() {
    var bar;

    bar = new ReallyMassiveObject();
    bar.someCall();
}

fooが戻ると、オブジェクトbarが指すオブジェクトは、それを参照するものが残っていないため、自動的にガベージコレクションに使用できます。

対比:

function foo() {
    var bar;

    bar = new ReallyMassiveObject();
    bar.someCall();
    return bar;
}
// elsewhere
var b = foo();

...これで、オブジェクトへの参照は呼び出し後も存続し、呼び出し元がbまたはbに何か他のものを割り当てるまで、またはスコープ外になるまで存続します。

また、対照的:

function foo() {
    var bar;

    bar = new ReallyMassiveObject();
    bar.someCall();
    setTimeout(function() {
        alert("Three seconds have passed");
    }, 3000);
}

ここでは、fooが戻った後でも、タイマーメカニズムにはタイマーコールバックへの参照があり、タイマーコールバック(closure)にはコンテキストへの参照があります。作成され、bar変数が含まれています。その結果、理論的には、barが返すものは、fooが戻った直後にガベージコレクションに使用できません。代わりに、タイマーが起動してコールバックへの参照を解放し、コールバックとそれが参照するコンテキストをGCの対象にするまで保持されます。 (実際には、最新のJavaScriptエンジンは、可能な場合にクロージャを最適化できます。たとえば、上記の静的分析では、コールバックがbarを参照せず、evalまたはnew Functionコードは、実行時に動的に参照する可能性があるため、JavaScriptエンジンは、関数が参照するコンテキストからbarを安全に除外できるため、参照内容をGCに適格にすることができます。 )。 ( この記事 の閉鎖についての詳細。)

JavaScriptは、循環参照のクリーンアップの処理に問題はありません。たとえば、次のようになります。

function foo() {
    var a, b;

    a = {};
    b = {};
    b.refa = a;
    a.refb = b;
}

fooが戻ったとき、abを参照しているという事実とその逆は問題ではありません。他にどちらも参照していないので、両方をクリーンアップできます。 IEでは、オブジェクトの1つがホスト提供のオブジェクト(DOM要素やnew ActiveXObjectを介して作成されたものなど)である場合、これはnottrueです。 JavaScriptオブジェクト。 (たとえば、JavaScriptオブジェクト参照をDOM要素に配置し、JavaScriptオブジェクトがDOM要素を参照している場合、どちらも参照していない場合でも、相互にメモリに保持されます。)しかし、それはIE バグissue、JavaScriptのものではありません。

再:

人々が標準のクライアントサイドAPIとしてjavascriptに戻ったのは、vbscript GCが悪いからですか?

JavaScriptは元のクライアント側のWebスクリプト言語でした。 VBScriptは、Microsoftがブラウザを発表した後、Microsoftブラウザでのみサポートされていました。 JavaScriptは、最も幅広いブラウザで作業したい場合、町で唯一のクライアント側スクリプトゲームです。 <subjective>これは、従来のVBScriptの言語の約8倍でもあります。 ;-) </主観>

78
T.J. Crowder

ガベージコレクション 原則として、すべての言語で同様の方法を使用します。ただし、それらの実装は環境によって異なります(たとえば、ブラウザーごとにJavaScript GCの実装方法が異なります)。 ChromeのGCの非常に簡単な概要については、たとえば、 this

VBScriptに関しては、IEでのみ実行されるJavaScriptのライバル/置換言語として作成されました。これは、VBSが導入された時点ではかなり合理的な決定でした-IEはブラウザシェアの90%以上を占めており、VBSは(広くサポートされ、古く、機能が乏しい時間)JavaScript;最近はそれほど多くありません。また、VBScriptは基本的にVisual Basic Liteであり、そのブランドに関連するすべての否定的な意味があります。

2
Piskvor