javascript - 如何在单页 javascript 应用程序中发现内存泄漏?

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

该应用程序是单页的,因此不会刷新,我们希望它能在 Android 设备上长时间运行。

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

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

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

我在这方面的经验很少,所以任何缩小这些讨厌的泄漏原因的建议都是非常好的!

不幸的是,由于程序的性质和大小,很难提供有用的代码 fragment 。对于这个长问题,我深表歉意。

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

最佳答案

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

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

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

地毯

关于javascript - 如何在单页 javascript 应用程序中发现内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31575231/

相关文章:

javascript - 如何优化我的 JavaScript?

android - 有什么方法可以控制 NavigationView header 中的 View 吗?

android - NullPointerException:尝试在空对象引用上调用虚方法 enableForegroundDispatch(...)

c++ - 在有向邻接表图中存储不同大小的边

C - 指针内存分配

javascript - 变量不保存 ionic Angular 数据

javascript - Youtube 数据 api v3 - 如何只要求播放列表中的一部分片段?

javascript - 在复选框选中时显示 div 并在未选中时隐藏它(即使在加载时,因为本地存储)

android - 改造 POST : JSON object does't send to PHP server

javascript - 在 onclick 中使用变量是否比使用 e.target 更糟糕?