【发布时间】:2011-01-09 14:07:39
【问题描述】:
我有一些使用 jQuery 的脚本,我认为其中一个有内存泄漏。
如何分析并找到我拥有的脚本的哪些部分使用最多的内存/CPU?
【问题讨论】:
标签: javascript performance memory-leaks profiling
我有一些使用 jQuery 的脚本,我认为其中一个有内存泄漏。
如何分析并找到我拥有的脚本的哪些部分使用最多的内存/CPU?
【问题讨论】:
标签: javascript performance memory-leaks profiling
关于内存消耗
JavaScript 中的内存泄漏通常会被忽略,除非它们变成浏览器内存泄漏(也就是说,即使在用户离开页面后,内存仍会继续分配并且无法释放它)。这样做的原因是,虽然您的 Web 应用程序可能存在一些内存泄漏,但用户会从一个页面转到另一个页面,从而最大限度地减少泄漏。但是他们可能不会重新启动浏览器,因此浏览器内存泄漏可能很严重。已知某些 JavaScript 代码会在某些浏览器上导致内存泄漏,其中 Internet Explorer 可能是该领域中最糟糕的。对于它,您可能会发现Microsoft JavaScript Memory Leak Detector 非常有用。
关于时间
IE、Chrome 和 Safari 在浏览器附带的 Web 开发工具中内置了分析器。对于 Firefox,您可以使用 Firebug。也可能有用,因为您使用的是 jQuery,这意味着您的分析报告将充满匿名函数等,使其非常难以阅读,John Resig's jQuery profiling plugin,这将为您提供关于此事的更清晰的输出。
【讨论】:
使用Firebug。引用http://getfirebug.com/js.html:
要使用分析器,只需转到控制台选项卡并单击“配置文件”按钮。然后使用您的应用程序或重新加载页面,然后再次单击“配置文件”按钮。然后,您将看到一份详细的报告,其中显示了调用了哪些函数以及每个函数花费了多少时间。
【讨论】:
谷歌浏览器也有配置文件选项
【讨论】:
另一种测试特定代码的简单方法是在其周围添加一个计时器。
var testStart = new Date();
// code to be tested here
$('#jstest').html("selected function: "+ (new Date() - testStart) + " milliseconds");
其中 jstest 是页面上某处可见的 span 元素。
【讨论】:
虽然 chrome 内置了分析选项,但它并没有提供有关对象的精确信息。所以我更喜欢使用leak-finder-for-javascript 工具来帮助我编写代码。
https://code.google.com/p/leak-finder-for-javascript/
我希望这会有所帮助。
【讨论】:
Firebug 或 Google 的 Page Speed for Firefox 具有分析工具。
【讨论】:
John Resig (jQuery) 的这篇文章可能有助于检测 IE 中的内存泄漏:
【讨论】: