在Chrome中查找JavaScript内存泄漏

3
我在我的网站上做了很多ajax调用,一直使用jQuery 1.4.2,但我发现它有泄漏问题。不管是IE、Firefox还是Chrome都有这个问题。经过一些调查,我找到了IE的解决方法,但它并没有解决任何一个浏览器的问题。然后我在这里找到了一个帖子,其中的人将雅虎的JavaScript库与jQuery进行了比较。那个人没有发现雅虎有泄漏问题。我切换到了雅虎的库,它确实停止了IE和Firefox的泄漏(我甚至使用了Firefox的泄漏附加组件)。但是Chrome仍然有泄漏问题。Chrome增加到大约200MB的内存,然后崩溃我的标签页。Ajax每秒钟调用一次,需要大约一个小时才会崩溃。如果我离开页面,内存就会释放。同样,IE和Firefox的问题现在已经解决了。
如何确定Chrome的问题是什么?我找了一个插件,但还没有找到。我在Google上也搜索了一些内容,但没有找到有用的结果。我进行了堆快照,但我只看到(closure)和(code)旁边的大量数字。
我喜欢Firefox的(Leak Monitor),它使问题易于观察。有没有类似的东西适用于Chrome或者有没有找到泄漏的建议?

你确定是浏览器的问题吗?你看过你的代码了吗?我也经常进行大量的Ajax请求,但从来没有在任何浏览器中出现过泄漏问题。 - Etienne Marais
我已经看了两天的代码。我已经用IE 8,Firefox 3.6.10和Chrome 8.0.555.2进行了测试。正如我所说,它在所有三个浏览器上都出现了问题,直到我改用Yahoo的JavaScript库。现在这个问题只在Chrome上发生。你有读懂我写的吗? - GregInWI2
2个回答

6

使用Chrome内置的堆分析器(按F12进入Chrome,然后转到“Profiles”选项卡):

enter image description here

您可以在此处找到如何测试它:

链接


我无法成功运行那个教程。我该如何找到“detached”引用? - pauloya
我认为那只是教程中的一个笔误。尝试将var detached = null;作为全局变量添加进去。 - denu
我认为这不会改变任何事情,因为detached被隐式地声明为全局变量。这种堆内存分析似乎太难理解了,而且这个教程一点也没有帮助。我猜在列表中detached显示为HtmlDivElement,但哪一个是哪一个呢? - pauloya

4
框架并不会导致泄漏,而是你的代码。让我猜一下你的代码长什么样子。
$.get('//url/',function(){
   //lets do fun stuff!
   function(){
     //more fun expensive stuff for the browser to do
   }
};

//A more efficient way (doesn't create closures)
function expensivefn(){
  //Do expensive stuff here
}
$.get('//url',expensivefn);

这只是您的代码可能效率低下的一种可能方式。通常我不会创建无限循环的页面,而是会查找一段时间然后询问用户是否仍想轮询。您使用的循环可能会像上面的例子一样创建不必要的闭包。例如,

//Bad!
setInterval(function(){
  //Expensive stuff
}, 1000)

//Good
function expensivestuff(){
  //Expensive stuff
}
setInterval(expensivestuff,1000);

我不再使用jQuery,而是使用Yahoo的库。但是,第一个示例与我之前的操作类似(排除函数内部的函数)。我在一个jQuery教程中发现了它,用于进行ajax调用。我正在寻找一种类似于Firefox可用的工具来查找泄漏问题。IE和Firefox现在已经解决了问题,但Chrome仍然存在问题。 - GregInWI2
实际上,看旧的 jQuery 代码,我没有这样做。它看起来像这样:$('#ajax').load(url)。那是有泄漏的。 - GregInWI2
你能把你的IE修复方案发布一下吗?你是如何确定这行代码存在泄漏问题,或者说你的JS代码存在泄漏问题的,你使用了哪些工具? - Drew
Leak Monitor插件对于Firefox浏览器来说,它指出漏洞是由jQuery库内部引起的。当我将我的ajax调用更改为使用Yahoo的时候,它停止了报告漏洞。我让IE、Firefox和Chrome运行一段时间,并观察了内存使用情况。IE和Firefox都很好,但Chrome仍然存在问题。 - GregInWI2

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