我如何在单页javascript应用程序中找到内存泄漏
How can I find memory leaks in a single-page javascript app?
应用程序是一个单页面,所以它不会被刷新,我们希望它能在android设备上运行更长的时间。
我们目前在大约18小时后看到崩溃(和一个logcat报告表明在android上运行时出现OOM错误)。当我使用远程调试和使用chrome的开发工具捕获时间轴时,很明显我们有内存泄漏,因为我们看到一个稳步增长的js堆。堆似乎在继续增长,直到我强制执行垃圾收集。
另一件对我来说似乎很奇怪的事情是,在时间轴上,我还可以看到我们的事件侦听器正在增长,并且似乎不受强制GC的影响。这是问题本身吗?(根据时间轴,我们说的是成千上万的听众)
除了标准的"3快照堆分析技术"之外,有没有人有任何建议?这在这里不是很有帮助,因为堆即使在没有交互的情况下也在增长,我认为这是由于我们在后台读取和显示数据时所做的一些周期性更新。否则,我完全可以接受任何其他内存分析工具!
我在这方面没有什么经验,所以任何关于缩小这些令人讨厌的泄漏原因的建议都会很棒!
不幸的是,由于程序的性质和大小,很难提供有用的代码片段。很抱歉我问了这么长的问题。
编辑:我最强烈的怀疑之一是,当我查看开发工具的时间轴时,发现侦听器在不断增加,并且从未被垃圾收集……这最终会导致坠机吗?
我曾经做过一个单页应用,也让一些东西永远运行在那里,遇到了和你一样的问题。我有一个无限的while(true)循环。即使我在循环结束时取消了变量和对象,javascript的GC也不会收集垃圾。
解决方案吗?我将while(true)循环更改为定时事件。每隔1秒做一些事情,使用javascripts timeout方法。
从这个我了解到,javascript的不运行GC上的while(true)方法。你的代码中有类似的东西吗?
地毯
- 重复应用 d3 转换导致的内存泄漏
- IE7中的blockUI插件内存泄漏25kb
- Javascript闭包-如何防止内存泄漏
- jQuery Draggable:内存泄漏
- "检测到可能的EventEmitter内存泄漏”;使用Gulp+Watchify+Factor捆绑包
- 在Dojo类中递归调用setTimeout时是否存在内存泄漏
- 是内存泄漏
- 将处理程序留在img.onload上是内存泄漏
- 具有并发sse连接的node.js内存泄漏
- 简单对象的Javascript内存泄漏
- WeakMap是否会将我从父/子关系的内存泄漏中拯救出来
- Javascript绘制画布内存泄漏
- Node.js”;检测到EventEmitter内存泄漏”;
- 正在清理内存泄漏
- 递归Javascript对象是否会导致任何问题(内存泄漏)
- Angular JS$编译服务导致$watch内存泄漏
- 如何防止和防范闭包内存泄漏
- 跟踪 JavaScript 内存泄漏的工具
- 页面刷新后javascript内存泄漏有问题吗?为什么?
- XMLHttpRequest循环内存泄漏