chrome私有内存不明原因的增长

时间:2013-05-31 15:07:43

标签: javascript google-chrome memory-management memory-leaks google-chrome-devtools

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

共享内存 - 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调试器打开会影响它吗?

1 个答案:

答案 0 :(得分:4)

我无法找到关于私人记忆与javascript记忆的确切时间和内容的信息。但是我可以回答这个问题:“让Chrome调试器打开会影响这个”......是的。

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

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