垃圾收集如何在JavaScript中运行?

Ali*_*ini 29 javascript vbscript garbage-collection

垃圾收集如何在JavaScript中运行?它与.NET垃圾收集类似吗?是因为在VBScript中实现垃圾收集很糟糕,以至于人们避开垃圾收集并建立了对JavaScript作为标准客户端语言的偏好?

T.J*_*der 80

垃圾收集如何工作?

简短的回答是:当一块内存(比如一个对象)不再可达时,它就有资格被回收.它何时,如何或是否被回收完全取决于实现,并且不同的实现以不同的方式进行.但在语言层面,它是自动的.

例如:

function foo() {
    var bar;

    bar = new ReallyMassiveObject();
    bar.someCall();
}
Run Code Online (Sandbox Code Playgroud)

foo返回时,目标bar指向是自动进行垃圾回收,因为没有什么留给有对它的引用.

对比:

function foo() {
    var bar;

    bar = new ReallyMassiveObject();
    bar.someCall();
    return bar;
}
// elsewhere
var b = foo();
Run Code Online (Sandbox Code Playgroud)

...现在对该对象的引用在该调用中幸存,并持续到/除非调用者将其他内容分配给范围bb超出范围.

另外对比:

function foo() {
    var bar;

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

这里,即使在foo返回之后,计时器机制也会引用计时器回调,而计时器回调 - 一个闭包  - 引用它创建的上下文,而后者又包含bar变量.因此,从理论上讲,返回bar时不能立即进行垃圾收集foo.相反,它一直保持到计时器触发并释放其对回调的引用,使得回调及其引用的上下文符合GC的条件.(实际上,现代JavaScript引擎可以并且尽可能地优化闭包.例如,在上面,静态分析显示回调不引用bar,并且不包含任何evalnew Function可能在运行时动态引用它的代码,因此JavaScript引擎可以安全地bar从函数引用的上下文中删除,从而使其引用符合GC的条件 - 而现代的则可以.(有关本文中的闭包的更多信息.)

JavaScript没有问题处理清理循环引用,顺便说一下,例如:

function foo() {
    var a, b;

    a = {};
    b = {};
    b.refa = a;
    a.refb = b;
}
Run Code Online (Sandbox Code Playgroud)

foo返回时,这一事实a被提及b,反之亦然是没有问题的.由于没有其他任何内容涉及它们中的任何一个,它们都可以被清理.上IE,这是如果对象中的一个是主机提供的对象(例如,DOM元素或通过创建真实的东西new ActiveXObject),而不是一个JavaScript对象.(例如,如果你将一个JavaScript对象引用放在一个DOM元素上,并且JavaScript对象引用回DOM元素,那么即使没有人引用它们中的任何一个,它们也会在内存中相互保留.)但这是一个IE bug 问题,而不是JavaScript的东西.

回覆:

是因为vbscript GC很糟糕,人们还原为javascript作为他们的标准客户端api?

JavaScript是原始的客户端Web脚本语言.VBScript仅在微软推出浏览器后才出现,并且只在Microsoft浏览器中得到支持.如果你想使用最广泛的浏览器,JavaScript曾经并且是城里唯一的客户端脚本游戏.<主观>它也是VBScript经典语言的八倍.;-) </ subjective>

  • 简短的回答是:它取决于平台.每个浏览器或JS VM都可以按照自己的方式自由实现.但很好的解释. (5认同)
  • @haylem:确实 - 好吧,在极限之内.平台无法以违反JavaScript范围规则的方式回收事物.并且*从不*回收任何东西的平台可能不会成功. (2认同)
  • @TJ Crowder:是的,但是他们显然可以拥有自己的优化技巧和不同的引用计数方法. (2认同)
  • @haylem:对.*"何时,如何或是否回收完全取决于实施......"* (2认同)