我正在分析我编写的javascript库,寻找内存泄漏.该库为后端提供API和服务.它不做任何html或dom操作.它不加载任何资源(图像等).它唯一做的就是发出xhr请求(使用jquery),包括一个长轮询,并通过事件(使用Backbone事件总线)传递和接收来自UI的数据.
我测试了这个库,一夜之间运行了16个小时.加载它的页面只会加载库并发送启动服务的登录请求.在测试过程中没有html,css或其他dom更改.
在测试过程中发生的所有事情都是图书馆每15秒向服务器发送一次心跳(xhr请求),并且每隔30秒通过长轮询收到一次心跳.
我在打开chrome任务管理器的情况下运行测试,并打开chrome调试器,以便从时间轴强制GC.
在测试开始时,在我强制初始GC之后 – 这些是来自chrome任务管理器的统计数据:
记忆 – 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调试器打开会影响这个吗?