【发布时间】:2014-07-13 08:17:58
【问题描述】:
我正在对我们的配置页面中似乎存在内存泄漏的问题进行故障排除。该页面用于更改我们服务的配置并显示健康诊断。这意味着我们定期查询服务以获取配置和检测信息(通常我们使用 30 秒的查询间隔,但为了排除故障,我以 100 毫秒的间隔查询)。我们依赖于 knockoutjs、datajs、jquery 和 spinjs。
我发现,如果我以 100 毫秒的查询间隔打开页面,Chrome 浏览器选项卡的私有字节会从大约 50MB 增长到 335MB。我有四页关于这个问题的内容,但在我的故障排除工作中我只关注其中一页。使用 chrome://memory-redirect/ 我可以看到页面(进程 id 26148)内存。
但是,JavaScript 堆内存在同一时期似乎持平,为 3.6MB。使用 Chrome 中的堆分析工具显示我所有的对象分配都是垃圾回收的。
在上图中,灰色的分配表示对象已被 GC 清理。
内存时间线也是不变的。
我还强制进行了两次 GC,并确认两次 GC 之间的文档、节点和侦听器的数量是恒定的。
我的问题是:
- 不属于 JavaScript 堆的进程内存在哪里使用?
- 鉴于我们的 JavaScript 堆内存是平坦的,那额外的内存会不会是我们的 JavaScript 代码导致的内存泄漏?
感谢大家的帮助!
【问题讨论】:
-
控制台打开时是否启用了网络选项卡?这将为每个发出的请求保留一份请求标头、响应标头、正文等
-
@PaulS。 - 您是否暗示如果打开网络选项卡可能会导致问题?在运行显示内存使用量增加的测试时,我没有启用 Chrome 开发工具,包括网络选项卡,因为我担心它会使用大量额外内存并给我错误的结果。
-
你有没有找到这个问题的答案?我们在 Chrome 40 中看到了相同的行为。
-
我也看到了同样的情况。运行每秒进行大量 REST 调用的应用程序。选项卡内存随 REST 调用成比例增长,但堆大小保持大致相同。铬 40。
-
@CullyLarson - 我从来没有找到确切的根本原因。最后,我采用了宏方法,只是将页面打开了数周,以查看进程的内存会发生什么。内存最终被清理干净,并没有无限增长。它仍然太高了,我不喜欢(这是很久以前的事了,我现在不记得确切的数字了),但至少有一个限制。
标签: javascript memory memory-leaks