信任Javascript垃圾收集器

Trusting Javascript garbage collector

本文关键字:收集器 Javascript 信任      更新时间:2023-09-26

我有几个例子,我的Javascript代码似乎在泄漏内存,但我不确定垃圾收集器应该得到什么。

例如,Firefox中运行的间隔计时器函数中的var = new Object()似乎会随着时间的推移而泄漏。有一些简单的解决方案,但我很好奇我是否应该期望垃圾收集器处理所有事情,或者我负责帮助垃圾收集器。

如果我需要帮助垃圾收集器,规则是什么?

大多数(我相信所有)Javascript(ECMAScript)引擎都通过一种称为"引用计数"的方法工作。

简而言之,当没有任何对象指向它时,它就会被释放。。。

有两件事可能会让你感觉不到有多少内存在被使用。

1) ECMAScript不会在系统处理完对象后立即释放该对象。垃圾回收是"根据需要"运行的。这可能会有很大的不同。

2) 闭包对引用的保留时间可能比你想象的要长。意外的关闭可能会比你预期的时间更长。

不得不将其作为一个答案,而不是长度的注释:

好的——首先对术语进行澄清:

如果它在计时器上运行,那么它是而不是递归的。然而,这是一个常见的误解。

它是递归代码,函数调用自己——原始函数调用保留在堆栈上,直到整个过程最终展开,并将值返回给原始调用方。当使用超时时,函数的每次迭代都在一个单独的执行上下文中。

递归函数示例函数阶乘(n){如果(n==1){返回1;}其他{返回n*阶乘(n-1);}}

这是/不是/递归的:函数烦恼(){window.setTimeout(烦人,1000);window.aalert("这会让每一秒都感到烦恼!");}

"烦恼"的每一次迭代都是完全独立的。它只是为要调用的另一个实例设置计时器。堆栈上没有一堆"烦人"函数,也不能向调用方返回任何内容。

第二:在我给你的例子中,变量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/