我每秒调用50次函数,因为它在<canvas>
元素上绘制很多东西,所以会做一些昂贵的事情。
它工作得很好,没有任何问题,但我只是看了一下内存使用情况,它每秒内存占用1MB。 Chrome似乎是垃圾收集,因为它每分钟都会消失,但随后用量再次增长。
我尝试的是将return
放在我的函数中的某些位置,以便确定我的函数的哪个部分确切地导致泄漏。我已经能够将其缩减为特定的代码行,之后邪恶的部分来了,但我真的不知道如何解决它。
我的问题是:
null
/ undefined
是否有效,比如处理它们?如果源代码确实是必要的,我会毫不犹豫地将其发布在此处,但我必须承认,对于其他人而言,它既有点长,也许有点不可理解。
答案 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。
答案 1 :(得分:3)
查看Chrome开发者工具中“配置文件”标签下的堆配置文件,了解有关内存使用情况的信息。
您可以执行以下操作以防止内存泄漏:
var
关键字为变量提供函数范围,因此当它们超出范围时可以对它们进行垃圾回收。没有var
关键字变量具有全局范围。delete variable;
语句删除对象以及内存中的引用。将变量设置为null只会从内存中删除对象,但不会删除它的引用。