2011-03-03 301 views
8

我调用一个函数的第二,做一些昂贵的东西,因为它是一个<canvas>元素很多画50次。内存泄漏

它的伟大工程,没有问题,但我只是看了一下内存使用情况,并偷了我的1MB RAM的第二位。 Chrome似乎是垃圾收集,因为它每分钟左右都在下降,但随后使用量再次增长。

我试过是把return在某些地方在我的功能,从而决定什么我的部分功能是什么导致了泄漏。我已经能够将它缩减为特定的代码行,之后会出现邪恶部分,但我不知道如何解决它。

我的问题是:

  • 什么工具可以有效地测量在Chrome的JavaScript内存泄漏?
  • 难道是有效的,他们一直在使用后的变量设置为null/undefined,像他们处置?

如果源代码是真的有必要我会毫不犹豫它张贴在这里,但我必须承认,这是长期和别人也许有点ununderstandable。

回答

9

我只是要拉这句话直接从文章中链接;

说到内存泄漏,打破循环引用 - 泄漏的原因 - 通常使用简单的空赋值来完成。通常不需要使用删除。此外,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'ing。

delete Explained

+0

其实,我没有循环引用。这是所有定制的'Vector'类,它们代表了我的渲染器函数中的3D和2D点。如果我每秒拨打50次这个功能,我想他们正在记忆中积累。零空仍然有帮助吗?我一直在尝试无用,都使用'delete'和'= null'。 – pimvdb 2011-03-03 15:49:24

+0

@pimvdb阅读文章,它很长,但非常全面地展示了删除实际如何工作。我不能说任何一种选择对你而言都是成功的。 js泄漏总是b ** ch。 – Andrew 2011-03-03 15:59:01

3

看在Chrome的开发者工具有关内存使用信息的配置文件选项卡下的一堆资料。

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

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

感谢。你可能知道for循环变量(例如'i')是否会在for循环结束后自动处理? – pimvdb 2011-03-03 14:51:26

+4

@pimvdb:它不会,因为只有函数在javascript中定义范围。阅读更多关于JavaScript范围的信息:http://www.adequatelygood。com/2010/2/JavaScript-Scoping-and-Hoisting – 2011-03-03 15:01:14