如何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'
这里是一篇关于这个:
Chrome现在提供了更好的工具来查找内存泄漏,而不是大多数情况下的答案。
这里是用近期的Chrome浏览器在javascript中查找内存泄漏:
- 按F12打开开发人员工具,然后转到“ 内存”选项卡 。
-
select您要检查泄漏的function或部分应用程序。 例如,当一个对话框被打开并再次closures时,它所使用的内存应该被释放。
-
执行一次你想检查内存泄漏的操作(例如打开一个对话框),这样可以加载潜在的全局服务。 这可以防止这些有意保存的对象显示为泄漏。
-
现在selectlogging分配时间线 ,然后按开始 。 重复你想检查泄漏几次的行动。 所以例如打开一个对话框,closures并重复。 当你这样做时,Chrome会绘制部分灰色或蓝色条形的时间线。 通常,您每次在页面上执行操作时都会看到一个栏。 当动作的几个先前的迭代栏保持部分蓝色时,通常意味着存在内存泄漏。 条形图的蓝色部分表示此时分配的内存,尚未再次释放。 按下开发人员工具左上方的红点,停止录制。
- 当你看到潜在的泄漏,你必须检查时间线的这一部分来find源。 select时间线的一部分,这是过去几次迭代的行为。 Chrome将显示内存中仍然存在的对象types列表。 保留的大小列给你一个印象,仍然使用了多less内存。 浏览到其中一个对象types并select一个对象。 如果你这样做,保持者列表将出现在下面。
-
保持器列表显示引用选定对象的“父”对象。 现在,您需要查看固定器和您的代码,以了解内存未被释放的原因。 例如在图像中您可以看到types范围的对象。 第二行说范围是“initFormat()中的上下文”。 问题是initFormat是一个事件监听器,在对话框离开后没有被绑定。
-
修复代码后,检查问题是否已解决。 刷新页面并再次重复步骤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中的内存泄漏情况,但这一讨论同样适用于其他浏览器。
这里是关于内存泄漏概念的完整示例描述…
从这里冒出来
- 如何从Google Chrome扩展程序获取当前标签的url?
- 获取错误“表单提交已取消,因为表单未连接”
- Chrome扩展程序:如何将文件保存在磁盘上
- 资源被解释为样式表,但是以MIMEtypestext / html传输(似乎与web服务器无关)
- Google Chrome浏览器扩展程序 – 单击工具栏图标时打开“新build”选项卡
- javascript onbeforeunload不显示自定义消息
- 有没有一种方法来唯一标识内容脚本运行在我的Chrome扩展的iframe?
- Google Chrome使用哪个图书馆资料库?
- Google Chrome扩展程序中的网页抓取(JavaScript + Chrome API)