我有几个实例,我的Javascript代码似乎在泄漏内存,但我不确定我应该从垃圾收集器中得到什么。
例如,在Firefox中运行的间隔计时器功能中的var = new Object()
似乎会随着时间的推移而泄漏。有一些简单的解决方案,但我很好奇我是否应该期待垃圾收集器处理所有事情,或者我负责帮助垃圾收集器。
如果我需要帮助垃圾收集器有什么规则?
答案 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.
此时,我能做的最好的事情就是把你指向: