JavaScript 应用程序 - 内存泄漏

3
我开发了一个客户端应用程序,不幸地我怀疑出现了内存泄漏。
该应用程序有很多私有克隆对象,在每个函数的结尾处,我通过将它们设置为null(foo = null;)来处理这些对象。
我的问题是,我应该如何处理这些对象?
只使用foo = null是否足够?
此外,是否有任何工具可以帮助我识别问题? 解决方案: 最终,我的问题是由于错误使用jQuery进度条引起的。
        function updateProgressBar() {
        if (!handle) //by adding this, the problem solved. 
            return;
        jQuery("#progressbar").progressbar({
            value: ++pct
        });
        if (pct >= 100) {
            clearInterval(handle);
            pct = 0;
            setInterval("updateProgressBar()", 300);
        }
    }

2
你为什么怀疑内存泄漏? - KTastrophy
我观察浏览器的进程并访问应用程序,一两分钟后内存急剧增加,最终浏览器会显示“内存不足”的消息。也许我使用了错误的词语“猜测”,正确的是我确定这一点 :) - profanis
查看 Chrome 开发者工具。有一个堆快照可以显示您在 x 时间消耗了多少内存,并允许您浏览整个链条。 - Snuffleupagus
知道你在哪些浏览器中看到这个问题会很有帮助。 - Erik Reppen
Firefox和Chrome。最后是错误使用了jQuery progressBar()。但是通过这个任务,我学会了如何识别内存泄漏 :) - profanis
2个回答

3
浏览器中内存泄漏的主要原因是DOM和JavaScript对象之间存在循环链接。当孤立的DOM节点仍然引用事件处理程序或其他JS对象时,这种情况经常发生。http://code.google.com/chrome/devtools/docs/heap-profiling-dom-leaks.html Chrome开发者工具可以查看堆并检查仍留在内存中但未通过“Heap Profiler”使用的元素。http://gent.ilcore.com/2011/08/finding-memory-leaks.html 但是,实际上,将属性设置为null足以打破循环引用,并应该修复内存泄漏问题。

你建议的第二个网址非常好。非常感谢。 - profanis
不幸的是,第二个链接涉及到一个使用 Mac 的用户。任何用户在 Mac 上所做的事情都应该被丢弃。愚蠢的 Mac,这些把戏只适合孩子们。 </silly> - ShadowScripter
@ShadowScripter,没听懂你的幽默 :p - Ruan Mendes

0

可能是闭包的问题吗?您可以尝试使用当前浏览器提供的方法,例如Chrome的Speed Tracer

无论如何,提供您正在使用的代码片段将有助于尝试识别问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接