如何findJS内存泄漏?

我一直在使用Chrome浏览器的堆分析器,但是它很混乱。 特别是如果里面有最小化的库。 但即使是元朗的观点,可能不会被删除的元素也很不清楚。

有没有任何提示如何使用堆转储在铬findJS代码,导致内存泄漏,不能被GC清理的代码…以及如何find乱七八糟的东西即使从DOM删除的元素?

换句话说,如何正确读取chrome中的堆转储? 统治者观点? 比较?

谷歌开放源代码的工具, 泄漏finder-for-javascript 。 他们还提出了一种所谓的三快照技术 (在本文中也可以看到一个简短的描述)。

泄漏探测器链接的第一段

注意:jsleakcheck不再支持! 它正在对付非官方和不稳定的开发工具协议,以获取堆快照。 该协议正在进行中,它不够稳定,以便我可以保持jsleakcheck与各种Chrome版本工作。 另外,jsleakcheck正在使用的一个较低级别的兼容性工具remote_inspector_client.py与Dev Tools进行通信。

在Chrome开发人员工具中,有一个时间轴 – 内存选项卡:

在这里输入图像说明

我们可以看到它所占用的内存。

还有configuration文件 – 内存,我们可以在这里快照,看看里面有什么。 快照可以相互比较:

在这里输入图像说明

大多数时候,它不会告诉你任何事情。 但至less你可以看到哪些物体在堆积,可能是泄漏的结构。

其他方式是使用'Task Manager'这里是一篇关于这个:

http://www.javascriptkit.com/javatutors/closuresleak/

Chrome现在提供了更好的工具来查找内存泄漏,而不是大多数情况下的答案。

这里是用近期的Chrome浏览器在javascript中查找内存泄漏:

  1. F12打开开发人员工具,然后转到“ 内存”选项卡

Chrome开发人员工具 - 内存选项卡

  1. select您要检查泄漏的function或部分应用程序。 例如,当一个对话框被打开并再次closures时,它所使用的内存应该被释放。

  2. 执行一次你想检查内存泄漏的操作(例如打开一个对话框),这样可以加载潜在的全局服务。 这可以防止这些有意保存的对象显示为泄漏。

  3. 现在selectlogging分配时间线 ,然后按开始 。 重复你想检查泄漏几次的行动。 所以例如打开一个对话框,closures并重复。 当你这样做时,Chrome会绘制部分灰色或蓝色条形的时间线。 通常,您每次在页面上执行操作时都会看到一个栏。 当动作的几个先前的迭代栏保持部分蓝色时,通常意味着存在内存泄漏。 条形图的蓝色部分表示此时分配的内存,尚未再次释放。 按下开发人员工具左上方的红点,停止录制。

内存时间轴

  1. 当你看到潜在的泄漏,你必须检查时间线的这一部分来find源。 select时间线的一部分,这是过去几次迭代的行为。 Chrome将显示内存中仍然存在的对象types列表。 保留的大小列给你一个印象,仍然使用了多less内存。 浏览到其中一个对象types并select一个对象。 如果你这样做,保持者列表将出现在下面。

家臣名单

  1. 保持器列表显示引用选定对象的“父”对象。 现在,您需要查看固定器和您的代码,以了解内存未被释放的原因。 例如在图像中您可以看到types范围的对象。 第二行说范围是“initFormat()中的上下文”。 问题是initFormat是一个事件监听器,在对话框离开后没有被绑定。

  2. 修复代码后,检查问题是否已解决。 刷新页面并再次重复步骤3到6。 如果你从来没有检查过内存泄漏,那么你不可能find多个问题。

其他提示:

  • 有时会有caching保留部分内存。 通常你可以忽略它们。
  • 当看到对象types列表中的HTMLDivElement或其他DOM元素时,请看一下。 如果此列表中的对象以红色突出显示,则表示它们不再出现在您的页面中。 这意味着它们必须在代码中的某个地方引用。 您可能忘记解除绑定事件侦听器。
  • 通常阅读关于内存泄漏的信息 ,以便您可以在代码中更快地识别它们。

我发现这篇文章很有见地:

http://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/

它涵盖了广泛的铬开发人员工具,并解释了如何处理您的应用程序似乎有内存问题。

这里是一个非常好的post,关于如何使用Google开发者工具查找内存泄漏: http : //gent.ilcore.com/2011/08/finding-memory-leaks.html

这是另一个很好的网页: http : //javascript.crockford.com/memory/leak.html

如果你正在开发客户端可重复使用的脚本对象,迟早你会发现自己发现了内存泄漏。 有可能你的浏览器会像海绵一样吸记忆,你几乎无法find一个理由,你的网站访问了几页后,你可爱的DHTML导航的响应能力会严重下降。

微软开发者Justing Rogers在他的优秀文章中描述了IE漏洞模式。

在本文中,我们将从稍微不同的angular度来回顾这些模式,并使用图表和内存利用率图来支持这些模式。 我们还将介绍几个微妙的泄漏情况。 在开始之前,我强烈build议你阅读那篇文章,如果你还没有阅读。

为什么内存泄漏?

内存泄漏问题不仅限于Internet Explorer。 几乎任何浏览器(包括但不限于Mozilla,Netscape和Opera)都会在您提供足够条件的情况下泄漏内存(并不难,因为我们很快就会看到这一点)。 但是(在我看来,ymmv等)Internet Explorer是stream氓之王。

不要误解我的意思 我不属于人群大吼大叫“嗨IE有内存泄漏,检查这个新的工具[链接到工具],看看自己”。 让我们来讨论一下蹩脚的Internet Explorer是什么,并掩盖其他浏览器中的所有漏洞。“

每个浏览器都有自己的优点和缺点。 例如,Mozilla在初始启动时消耗的内存太多,不适用于string和数组操作。 Opera可能会崩溃,如果你写一个荒谬的复杂的DHTML脚本混淆其渲染引擎。

尽pipe我们将重点关注Internet Explorer中的内存泄漏情况,但这一讨论同样适用于其他浏览器。

这里是关于内存泄漏概念的完整示例描述…

从这里冒出来