2

我有几个实例,其中我的 Javascript 代码似乎正在泄漏内存,但我不确定垃圾收集器应该期待什么。

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

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

4

2 回答 2

0

不得不将此作为答案而不是对长度的评论:

好的——首先澄清一下术语:

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

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

递归函数示例 function factorial(n) { if (n == 1) { return 1; } else { 返回 n * 阶乘(n-1);} }

这是/非/递归的:function annoy() { window.setTimeout(annoy, 1000); window.alert("这会让每一秒都很烦人!"); }

'annoy' 的每次迭代都是完全独立且独立的。它只是为要调用的另一个实例设置计时器。堆栈上没有一堆“烦人”的函数,你不能向调用者返回任何东西。

其次:在我给你的例子中,变量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 回答
0

大多数(我相信所有)Javascript (ECMAScript) 引擎都通过一种称为“引用计数”的方法工作。我会让你去看看那个词。

简而言之,当没有任何东西指向它时,一个对象被释放以释放它……使用它。

有两件事可能会让您不了解正在使用多少内存。

1) ECMAScript 不会在系统处理完对象后立即释放它。垃圾收集“按需”运行。这可以有很大的不同。

2)闭包可以比你想象的更长时间地保持引用。意外关闭的时间可能比您预期的要长。

于 2012-08-24T07:54:19.390 回答