JavaScript中的内存泄漏:它们是什么,如何发现它们,如何创建它们

Mik*_*Sav 10 javascript

我刚刚为新开发人员提供了一些采访,JavaScript是我角色的主要部分,也是我们招聘的角色.说实话,候选人不是那么好,他并不真正理解JavaScript,但在采访中他把JavaScript与C#混淆,并开始讨论JS中的内存泄漏.我想干预,但是在那一点上,我意识到我对JS中的内存泄漏知之甚少,除了它们占用了大量内存并减慢了速度.

在采访中考虑这一点时,我唯一记得的是OReilly的Def Guide(认为是第四版)提到Mark和Sweep Garbage Collections.但自从我读到这篇文章以来,这种情况一直在消退,我无法真正扩展.我发现很少有关于这个主题的内容很简洁(除了Crockford的一篇文章并不清楚).

有人可以尽可能简单地总结一下:JS中的内存泄漏是什么,我们如何发现它们,如何创建它们 - 我多年来一直在编写JS,这完全打破了我的知识和信心,因为我从来没有真的想过这个!

jAn*_*ndy 4

实际上,在具有自动垃圾收集器的语言中,永远不可能出现“真正的”内存泄漏。named function expressions因此,如果存在内存泄漏,那么它总是底层引擎中的错误(例如,某些 IE 中的问题)。

因此,在我们澄清这一点之后,仍然可以通过 javascript 获得大量内存并保留它而不释放。但这无论如何都不是真正的内存泄漏。例如,每个都function call在 ECMAscript 中创建一个闭包。除其他外,词法闭包还会复制对每个父上下文数据(激活和变量对象)的引用。所以这需要一些内存,特别是当你创建很多闭包时。

Javascript DOM 世界的另一个例子:我们正在使用大图像创建动态图像new Image()并将源设置为大图像。现在,我们有了对图像的引用,并且在所有引用都消失或未使用之前,它无法被垃圾收集(即使一个好的内存工具会正确地告诉您内存用于图像而不是 javascript)。

但实际上,这些是您真正可以用这种语言“泄漏”内存的唯一场景。再说一次,它并不像 C 那样真正泄漏内存malloc(),你会再次忘记free()该部分。由于 ECMAscript 中没有动态内存管理,所以这些东西完全超出了您的范围。