JavaScript中的内存泄漏(Chrome)

时间:2011-03-03 14:22:00

标签: javascript google-chrome memory-leaks

我每秒调用50次函数,因为它在<canvas>元素上绘制很多东西,所以会做一些昂贵的事情。

它工作得很好,没有任何问题,但我只是看了一下内存使用情况,它每秒内存占用1MB。 Chrome似乎是垃圾收集,因为它每分钟都会消失,但随后用量再次增长。

我尝试的是将return放在我的函数中的某些位置,以便确定我的函数的哪个部分确切地导致泄漏。我已经能够将其缩减为特定的代码行,之后邪恶的部分来了,但我真的不知道如何解决它。

我的问题是:

  • 有哪些工具可用于有效衡量Chrome中的JavaScript内存泄漏?
  • 在使用变量后将变量设置为null / undefined是否有效,比如处理它们?

如果源代码确实是必要的,我会毫不犹豫地将其发布在此处,但我必须承认,对于其他人而言,它既有点长,也许有点不可理解。

2 个答案:

答案 0 :(得分:9)

我只是直接引用这句话,链接自文章;

  

说到内存泄漏,打破循环引用 - 泄漏的原因 - 通常是通过简单的null赋值来完成的。通常不需要使用删除。此外,null'ing允许“取消引用”变量 - 删除通常无法执行的操作。

var el = document.getElementById('foo');
// circular reference is formed
el.onclick = function() { /* ... */ };
// circular reference is broken
el = null;
// can't `delete el` in this case, as `el` has DontDelete
  

由于这些原因,在打破循环引用时最好坚持使用null。

delete Explained

答案 1 :(得分:3)

查看Chrome开发者工具中“配置文件”标签下的堆配置文件,了解有关内存使用情况的信息。

您可以执行以下操作以防止内存泄漏:

  • 使用JSLint测试您的代码,看看是否会给您一些指示。
  • 使用var关键字为变量提供函数范围,因此当它们超出范围时可以对它们进行垃圾回收。没有var关键字变量具有全局范围。
  • 使用delete variable;语句删除对象以及内存中的引用。将变量设置为null只会从内存中删除对象,但不会删除它的引用。