2012-08-15 85 views
16

我有一个Web应用程序,它在某处存在内存泄漏,我无法检测到它。我已经尝试了通常效果很好的Chrome开发人员工具,但是我无法追查那些有责任的代码行。 Chrome工具只是给了我太多的信息,我无法将内存中的对象与我的代码联系起来。查找JavaScript内存泄漏的工具

还有其他工具可能有帮助吗?

+0

[用于在JavaScript调试内存泄漏工具]的可能重复(http://stackoverflow.com/questions/3573252/tools-for-debugging-memory-leaks-in-javascript) – 2012-08-15 12:14:17

回答

22

更新: 允许使用记录堆分配配置文件类型。

  1. 开放devtools探查
  2. 做热身动作
  3. 开始探查
  4. 重复操作几次
  5. 如果操作有泄漏,您将看到相同数量的蓝色组总览窗格中的小节
  6. 停止分析器
  7. 在概览中选择一组这些蓝色条
  8. 考虑对象

见截屏Javascript Memory Leak detection (Chrome DevTools)

的名单: 您可以使用下一个场景的细化内存泄漏。

  1. 开放devtools探查
  2. 做一个动作,使泄漏
  3. 采取堆快照
  4. 重复步骤2和3棵树次
  5. 选择最新的堆快照
  6. 更换过滤器“所有对象“到”快照1和2之间的对象“

之后,您w生病看到对象是一组泄漏的对象。 您可以选择一个对象,然后查看Object的保留树中的保持器列表

+3

你如何追溯到你的代码保留? – thecountofzero 2013-04-12 03:13:23

+0

通常你只是知道谁将泄漏的对象添加到容器中,因为它是你的代码。但是,如果你不知道这一点,那么你可以用泄漏的对象类的新构造函数覆盖构造函数,该类会记录堆栈跟踪,并从控制台调用原始的构造函数。重复这些步骤并查看分配堆栈跟踪的对象。它可以给你一个线索,泄漏对象的来源是什么,以及哪个代码应该删除对泄露对象的最后崇拜。 – loislo 2013-04-14 08:02:07

2

使用Detached DOM tree视图中元素的innerHTML和outerHTML值来将内存中的对象映射到您的代码并追踪内存泄漏。

+0

jQuery的AJAX请求是在我的应用程序中最大的罪魁祸首。找到所有的ajax jQuery函数:.ajax(),.get(),.post()和内容制定者:.html(),.text()。转到开发工具中的网络选项卡,刷新当前页面10到20次。我解决了最近jQuery.load()在我的单页JS应用程序内存泄漏... 'if(!jQuery.terms_html) \t \t \t $('#tc_container')。load(STATIC_DOMAIN +)/ terms。 HTML”,函数(){ \t \t \t \t jQuery.terms_html = $( '#tc_container')。HTML() \t \t \t}) \t \t其他 \t \t \t $( '#tc_container')。HTML (jQuery.terms_html)' – 2018-02-21 07:57:54

0

jQuery ajax请求是我应用程序中最大的罪魁祸首。找到所有的ajax jQuery函数:.ajax(),.get(),.post()和内容制定者:.html(),.text()。

转到开发工具中的网络选项卡,刷新当前页面10到20次。如果您看到堆叠太频繁,或者调用没有完成,则会发生内存泄漏。

这是我能用jQuery.load()解决的最近的内存泄漏...

if(!jQuery.terms_html) $('#tc_container').load(STATIC_DOMAIN + '/terms.html', function() { jQuery.terms_html = $('#tc_container').html() }) else $('#tc_container').html(jQuery.terms_html)

另外,jQuery的在写这个的时候最新版本是3.3.1 。如果可能,安装最新版本是最好的入门方式。 https://github.com/jquery/jquery/releases