信任Javascript垃圾收集器

时间:2012-08-22 18:16:36

标签: javascript garbage-collection

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

有两件事可能会让你意识到正在使用多少内存。

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

2)闭包可以比你想象的更长时间保持参考。意外关闭可能比你预期的更长。

答案 1 :(得分:0)

不得不把这个作为答案而不是长篇评论:

好的 - 首先澄清条款:

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

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

递归函数示例     function factorial(n){       if(n == 1){         返回1;       } else {         return n * factorial(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/