【问题标题】:How can I find memory leaks in a single-page javascript app?如何在单页 javascript 应用程序中找到内存泄漏?
【发布时间】:2015-10-13 01:01:26
【问题描述】:

该应用是单页的,因此不会刷新,我们希望让它在安卓设备上运行更长时间。

我们目前在大约 18 小时后看到崩溃(以及在 Android 上运行时显示 OOM 错误的 logcat 报告)。当我使用远程调试并使用 chrome 的开发工具捕获时间线时,很明显我们有内存泄漏,因为我们看到一个稳定增长的 js 堆。在我强制进行垃圾回收之前,堆似乎会继续增长。

对我来说似乎很奇怪的另一件事是,在时间轴上,我还可以看到我们的事件侦听器正在增长并且似乎不受强制 GC 的影响。 这可能是问题本身吗? (根据时间轴,我们正在谈论成千上万的听众)

除了标准的“3 个快照堆分析技术”之外,有人有什么建议吗?这在这里不是很有帮助,因为即使没有与之交互,堆也在增长,我相信这是由于我们在幕后进行的一些定期更新以读取和显示数据。否则,我完全愿意接受任何其他内存分析工具!

我在该领域的经验很少,所以任何关于缩小这些严重泄漏原因的建议都会很棒!

不幸的是,由于程序的性质和规模,很难提供有用的代码 sn-ps。对于这个冗长的问题,我深表歉意。

编辑: 我最强烈的怀疑之一是,当我查看开发工具时间线并看到听众不断增加,并且永远不会收集垃圾时......这最终会导致崩溃吗?

【问题讨论】:

  • 我早先发现并添加了书签!很好的来源,因为它让我获得了一些更强大的基础知识。我还发现link 对理解 google 的工具很有帮助!
  • 当您不再需要监听器时,您是否会移除它们?我遇到过这样的问题,在我的 React 应用程序中,我会在组件挂载时添加侦听器,但在卸载之前忘记删除它们,导致一堆不需要的侦听器挂在那里。此外,如果一个组件重新挂载,它将添加另一个侦听器,而前一个侦听器仍然存在。我可以看到打算长时间保持打开状态的应用程序的哪个位置会成为问题。

标签: javascript android memory memory-leaks google-chrome-devtools


【解决方案1】:

伙计。我曾经也制作了一个单页应用程序,并且在那里永远运行着一些东西,并且遇到了同样的问题。我有一个无限的“while(true)”循环做某事。即使我在循环结束时取消了变量和对象,javascript 的 GC 也没有收集垃圾。

解决方案?我从 while(true) 循环更改为定时事件。每 1 秒做一件事,使用 javascripts 超时方法。

从中我了解到,javascript 不会在 while(true) 方法上运行 GC。你的代码中有类似的东西吗?

地毯

【讨论】:

  • 记住这一点很重要,我们所做的大部分工作都是定时的,但我一定会检查这样的循环!
猜你喜欢
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
相关资源
最近更新 更多