JavaScript堆内存是常量,但浏览器进程专用字节正在增长.记忆差异来自哪里?

r2_*_*118 5 javascript memory memory-leaks

我正在排除配置页面中出现内存泄漏的问题.该页面用于更改我们的服务配置,还显示健康诊断.这意味着我们定期查询服务以获取配置和检测信息(通常我们使用30秒的查询间隔,但要排除故障,我以100毫秒的间隔查询).我们依靠knockoutjs,datajs,jquery和spinjs.

我发现,如果我以100毫秒的查询间隔让页面一夜之间打开,那么chrome浏览器选项卡的私有字节就会从大约50MB增加到335MB.我有四个问题的页面,但在我的故障排除工作中我专注于一个.使用chrome:// memory-redirect /我可以看到页面(进程ID 26148)内存.

在此输入图像描述

但是,JavaScript堆内存在同一时期看起来是平坦的3.6MB.使用Chrome中的堆分析工具,它显示我的所有对象分配都是垃圾回收.

在此输入图像描述

在上图中,灰色分配表明GC已清理了对象.

在此输入图像描述

内存时间轴也是不变的.

在此输入图像描述

我还强制要求两个GC,并确认两个GC之间的文档,节点和监听器的数量是不变的.

在此输入图像描述

我的问题是:

  1. 使用的进程内存在哪里不是JavaScript堆的一部分?
  2. 鉴于我们的JavaScript堆内存是平的,那么额外的内存可能是由我们的JavaScript代码引起的内存泄漏吗?

感谢您的帮助!

Ste*_*ett -2

您正在比较苹果和橙子 - 子堆中垃圾收集的内存和整个应用程序内存。

您已使用 Chrome 检查了 JavaScript 堆,并发现了表明应用程序的 JavaScript 部分运行正常的证据。

您还使用一个工具来监控 Chrome 本身的全局内存使用情况。这是 Chrome 用于任何任务的所有内存,包括与应用程序不直接相关但与浏览器本身功能相关的任务。

也许您发现了一个在 Chrome 内部触发内存泄漏的用例?

或者也许不是内存泄漏,而是 Chrome 使用的非垃圾收集内部堆中的内存碎片?

根据这个网页, Chrome 是用 C、C++、Java、JavaScript 和 Python 混合编写的。这意味着我们拥有适用于 C 和 C++ 的确定性内存分配器,以及适用于 Java、JavaScript 和 Python 的三种不同类型的垃圾收集堆。坏消息:当涉及到垃圾收集时,Python 对整数的处理在内存使用方面并不是那么友好(我上次检查是在几年前,也许他们已经改进了)。

但我已经运行了几周的 Chrome 会话,没有出现任何问题。所以我确实想知道发生了什么。

你没有说你正在使用哪个操作系统,但如果你使用的是 Microsoft Windows,那么你可以使用C++ 内存验证器来检查 Chrome 运行时每个分配的位置(完整的调用堆栈、多少字节等)(从 C++ 启动 Chrome)内存验证器,加载您的应用程序,让它执行该操作,然后转到内存选项卡并单击刷新- 它将显示所有可以跟踪的实时分配 - 任何静态链接的堆都将无法跟踪,因为您没有符号以允许它们被钩住)。好吧,您没有符号使调用堆栈可读,但您仍然可以识别在同一位置发生的分配。这可能会为您提供有关泄漏/碎片原因的线索,以便您可以将此问题报告给 Chrome 开发人员进行更仔细的检查。

您在 Firefox 中也有同样的行为吗?如果您那么可以使用 C++ Memory Validator 执行我建议的操作,但在您自己构建的 Firefox 版本上执行此操作 - 您将拥有符号和源代码,并确切地知道问题出在哪里。

免责声明。我是 C++ Memory Validator 的设计者。