Dou*_*ler 5 javascript memory-leaks memory-management google-chrome google-chrome-devtools
我正在分析我编写的javascript库,寻找内存泄漏.该库为后端提供API和服务.它不做任何html或dom操作.它不加载任何资源(图像等).它唯一做的就是发出xhr请求(使用jquery),包括一个长轮询,并通过事件(使用Backbone事件总线)传递和接收来自UI的数据.
我测试了这个库,一夜之间运行了16个小时.加载它的页面只会加载库并发送启动服务的登录请求.在测试过程中没有html,css或其他dom更改.
在测试过程中发生的所有事情都是图书馆每15秒向服务器发送一次心跳(xhr请求),并且每隔30秒通过长轮询收到一次心跳.
我在打开chrome任务管理器的情况下运行测试,并打开chrome调试器,以便从时间轴强制GC.
在测试开始时,在我强制初始GC之后 - 这些是来自chrome任务管理器的统计数据:Memory - 11.7mb
Javascript内存 - 6.9 mb/2.6mb直播
共享内存 - 21.4 mb
私人记忆19mb
16小时后我强迫GC - 这些是新的统计数据:记忆 - 53.8mb
Javascript内存 - 6.9 mb/2.8mb live
共享内存 - 21.7 mb
私人记忆60.9mb
正如您所看到的,JS堆只增长了200k.
私人记忆增长了42mb!
任何人都可以提供可能解释导致私人记忆增长的原因吗?打开chrome调试器会导致或影响内存增长吗?
另一个想法是强制GC从时间线调试器只从JS堆中回收内存 - 所以其他内存没有被回收.因此,这可能不是"泄漏"本身,因为它最终可能被收集 - 虽然我不知道如何确认这一点.特别是不知道这个记忆代表什么.
最后,我确实读到xhr结果也存储在私有内存中.有没有人知道这是不是真的?如果是这样,该应用确实在这段时间内执行了大约5700 xhr的请求.如果42mb中的大部分是由于这个原因,这将意味着大约7k被分配 - 考虑到有效载荷非常小,这似乎很高.如果是这样的话; 什么时候会释放这个内存,我有什么办法可以让它被释放,并且让chrome调试器打开会影响这个吗?
小智 4
我无法找到有关私有内存与 JavaScript 内存的确切时间和内容的信息。不过我可以回答这个问题:“打开 chrome 调试器会影响这个”......是的。
打开开发人员工具会使浏览器收集/保留/显示有关正在制作的每个 XHR 的更多信息。当开发人员工具关闭时,不会收集/保留这些数据(正如大多数人所知,因为当您打开开发工具太晚并且错过了您关心的一个请求时,有时会非常烦人)。
您可以打开开发工具,触发GC,然后关闭开发工具,只有在您想要获取指标时才再次打开它们以触发GC。您还可以使用这个傻瓜 chrome://memory-redirect/ 来跟踪增长情况,而无需打开开发工具。
| 归档时间: |
|
| 查看次数: |
1872 次 |
| 最近记录: |