Javascript 如何找到JS内存泄漏?

Javascript 如何找到JS内存泄漏?,javascript,google-chrome,Javascript,Google Chrome,我在chrome中努力使用堆分析器,但它非常混乱。特别是如果里面有最小化的库。但即使是家庭成员的观点,可能无法删除的元素也非常不清楚 如何使用chrome中的堆转储来查找导致内存泄漏的JS代码、GC无法清理的代码,有什么提示吗。。。即使从dom中删除了元素,如何找到混乱的元素 换句话说,如何正确读取chrome中的堆转储?支配者观点?比较?这是一篇关于如何使用Google Developer工具查找内存泄漏的非常好的帖子: 这是另一个关于这一点的好网页:谷歌为此开发了一个开源工具。他们还提出了一

我在chrome中努力使用堆分析器,但它非常混乱。特别是如果里面有最小化的库。但即使是家庭成员的观点,可能无法删除的元素也非常不清楚

如何使用chrome中的堆转储来查找导致内存泄漏的JS代码、GC无法清理的代码,有什么提示吗。。。即使从dom中删除了元素,如何找到混乱的元素


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

这是一篇关于如何使用Google Developer工具查找内存泄漏的非常好的帖子:


这是另一个关于这一点的好网页:

谷歌为此开发了一个开源工具。他们还提出了一种称为的方法(另请参见中的简要说明)

注意:不再支持jsleakcheck!它使用的是一种非官方且不稳定的Dev-Tools协议,用于获取堆快照。 协议正在制定中,但不够稳定,因此我 可以让jsleakcheck与各种Chrome版本一起工作。在里面 此外,一个较低级别的兼容性工具, 远程_inspector_client.py,jsleakcheck使用它进行通信 使用开发工具,已被删除。


在Chrome开发者工具中,有一个时间线-内存选项卡:

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

还有配置文件-内存,我们可以在其中拍摄快照并查看其中的内容。快照可以相互比较:

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

另一种方法是使用
“任务管理器”
以下是一篇关于这方面的文章:


我觉得这篇文章很有见解:


它涵盖了大量的chrome开发者工具,并很好地解释了当应用程序出现内存问题时如何处理。

如果您正在开发客户端可重用脚本对象,您迟早会发现自己发现内存泄漏。很可能你的浏览器会像海绵一样吸吮内存,你很难找到一个原因来解释为什么你可爱的DHTML导航在访问了你网站中的几个页面后响应能力会严重下降

微软开发人员贾斯汀·罗杰斯(Justing Rogers)在他的优秀文章中描述了IE泄漏模式

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

为什么内存泄漏?

内存泄漏问题不仅限于Internet Explorer。如果您提供足够的条件,几乎任何浏览器(包括但不限于Mozilla、Netscape和Opera)都会泄漏内存(这并不难,我们很快就会看到)。但是(以我的拙见,ymmv等)Internet Explorer是泄密者之王

别误会我。我不属于那些大喊“嘿,IE内存泄漏,检查这个新工具[链接到工具],自己看看”的人群。让我们讨论一下Internet Explorer有多糟糕,并掩盖其他浏览器中的所有缺陷”

每个浏览器都有自己的优缺点。例如,Mozilla在初始启动时消耗了太多内存,在字符串和数组操作方面不太好;如果您编写了一个极其复杂的DHTML脚本,使其渲染引擎混乱,Opera可能会崩溃

虽然我们将重点讨论Internet Explorer中的内存泄漏情况,但此讨论同样适用于其他浏览器

下面是关于内存泄漏概念的完整示例说明


Chrome现在提供了比大多数答案出现时更好的查找内存泄漏的工具

下面是使用最新的Chrome浏览器查找javascript内存泄漏的步骤:

  • 按F12打开开发者工具并转到内存选项卡
  • 选择要检查泄漏的应用程序功能或部分。例如,当对话框再次打开和关闭时,应释放其使用的内存

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

  • 现在选择记录分配时间线,然后按开始。重复几次要检查泄漏的操作。例如,打开一个对话框,关闭它,然后重复。执行此操作时,Chrome会用部分灰色或蓝色条绘制时间线。通常,每次在y上执行操作时,都会看到一个条我们的页面。当动作的前几次迭代中的条部分保持蓝色时,通常意味着内存泄漏。条的蓝色部分表示此时分配的内存尚未释放。按开发工具左上角的红点停止录制。

  • 当您看到潜在泄漏时,您必须检查时间线的这一部分以找到泄漏源。选择时间线中过去几次重复操作的一部分。Chrome将显示内存中仍然存在的对象类型列表。保留大小列给您一个内存大小的印象仍在使用。浏览到其中一种对象类型并选择一个对象。如果执行此操作,将在下面显示夹持器列表
  • 夹持器列表显示引用所选对象的“父”对象。现在您需要查看夹持器和代码以了解
    window.performance.memory:
    
    MemoryInfo {
      totalJSHeapSize: 7084834,
      usedJSHeapSize: 6486770,
      jsHeapSizeLimit: 4294705152
    }
    
    window.performance.memory.usedJSHeapSize / window.performance.memory.jsHeapSizeLimit