5

我正在分析我编写的 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 实时

共享内存 - 21.7 mb

私有内存 60.9mb

如您所见,JS 堆仅增长了 200k。

私有内存增长了 42mb!

任何人都可以提供导致私人内存增长的原因的可能解释吗?打开 chrome 调试器会导致或影响内存增长吗?

我的另一个想法是,从时间线调试器中强制 GC 只会从 JS 堆中回收内存——因此其他内存不会被回收。因此,这本身可能不是“泄漏”,因为它最终可能会被收集——尽管我不确定如何确认这一点。尤其是在不知道这段记忆代表什么的情况下。

最后,我确实读到 xhr 结果也存储在私有内存中。有没有人知道这是不是真的?如果是这样,该应用程序在此时间范围内确实执行了大约 5700 个 xhr 请求。如果 42mb 的大部分是由于这个原因,那意味着大约分配了 7k - 这似乎很高,考虑到有效载荷非常小。如果是这种情况;何时释放此内存,我能做些什么来释放它,并且打开 chrome 调试器会对此产生影响吗?

4

1 回答 1

4

我无法找到有关私有内存与 javascript 内存的确切时间和内容的信息。但是我可以回答这个问题:“打开 chrome 调试器会对此产生影响”……是的。

打开开发人员工具会导致浏览器收集/保留/显示有关正在制作的每个 XHR 的更多信息。当开发人员工具关闭时,不会收集/保留这些数据(正如大多数人所知,因为当您打开开发工具时有时会非常烦人并且它错过了您关心的一个请求)。

您可以打开开发工具,触发 GC,然后关闭开发工具,仅在您想要获取指标时再次打开它们以触发 GC。您也可以使用这个傻瓜 chrome://memory-redirect/ 来跟踪增长,而无需打开开发工具。

于 2013-10-01T05:23:35.810 回答