【问题标题】:Finding Javascript leak in Chrome在 Chrome 中查找 Javascript 泄漏
【发布时间】:2010-10-13 14:59:40
【问题描述】:

我在我的网站上进行了很多 ajax 调用,并且一直使用 jQuery 1.4.2,直到我注意到它正在泄漏。它与 IE、Firefox 和 Chrome 一起泄露。经过一番调查,我找到了 IE 修复它。我试过了,但它没有为三个浏览器中的任何一个修复它。然后我在这里找到了一个帖子,该人将雅虎的 Javascript 库与 jQuery 进行了比较。雅虎并没有为那个人泄密。我切换到雅虎,它确实阻止了 IE 和 Firefox 中的泄漏(我什至使用了 Firefox 泄漏插件)。但是 Chrome 仍然在泄漏。 Chrome 建立了大约 200MB 的内存,然后让我的标签崩溃。 ajax 调用是每秒一次。标签崩溃大约需要一个小时。如果我离开页面,内存就会被释放。同样,IE 和 Firefox 的问题现在都没有了。

确定 Chrome 问题出在哪里的最佳方法是什么?我找了一个插件,但还没有找到。我也在谷歌上做了一些搜索,但也没有真正找到任何东西。我拍摄了堆快照,但我只看到(关闭)和(代码)旁边的大数字。

我喜欢 Firefox(泄漏监视器),它可以很容易地发现问题。对于 Chrome 是否有类似的内容或任何有关查找泄漏的建议?

【问题讨论】:

  • 你确定是浏览器?你看过你的代码吗?我也做了很多大的 ajax 帖子和获取,我从来没有使用任何浏览器泄漏。
  • 我看了两天的代码。我已经使用 IE 8、Firefox 3.6.10 和 Chrome 8.0.555.2 对其进行了测试。正如我所说,在我将其更改为使用雅虎的 javascript 库之前,所有 3 都发生了这种情况。现在问题只发生在 Chrome 上。你读过我写的吗?

标签: javascript google-chrome memory-leaks


【解决方案1】:

在 DevTools 中使用 Chrome 的内置堆分析器(在 Chrome 中按 F12,然后转到 Profiles 选项卡):

在这里你可以找到如何测试它:

link

【讨论】:

  • 我无法成功运行该教程。如何找到“分离”参考?
  • 我认为这只是教程中的错字。尝试添加 var detached = null;作为一个全局变量。
  • 我认为这不会改变任何事情,因为 detached 被隐式声明为全局变量。这个堆内存分析似乎很难理解,本教程根本没有帮助,我猜detached 在列表中显示为HtmlDivElement,但哪个是哪个?
【解决方案2】:

导致泄漏的不是框架,而是您的代码。让我猜猜你的代码是什么样子的。

$.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 的库。但是,是的,你应该做的第一个例子与我正在做的类似(不包括函数内部的函数)。我发现它是一个用于进行 ajax 调用的 jQuery 教程。我在询问一种工具来查找泄漏,例如 Firefox 可用的工具。 IE 和 Firefox 现在很高兴,但 Chrome 仍然不高兴。
  • 实际上查看旧的 jQuery 代码,我并没有这样做。这看起来像: $('#ajax').load(url);那是泄漏。
  • 你能把你的修复发布到 IE 上吗?你是如何确定这条线是泄漏的,或者你的 JS 代码一般是泄漏的,你使用了什么工具
  • 用于 Firefox 的泄漏监视器插件说它来自 jQuery 库。当我更改我的 ajax 调用以使用 Yahoo 时,它停止说有泄漏。我让 IE、Firefox 和 Chrome 运行了一段时间,并观察了内存使用情况。 IE 和 Firefox 都很好,但 Chrome 还是不行。
猜你喜欢
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2014-03-26
  • 2012-08-09
相关资源
最近更新 更多