javascript - chrome 私有(private)内存中无法解释的增长

标签 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 实时

共享内存 - 21.4 mb

私有(private)内存19mb

16 小时后我强制执行 GC - 这些是新的统计数据: 内存 - 53.8mb

Javascript 内存 - 6.9 mb/2.8mb 实时

共享内存 - 21.7 mb

私有(private)内存60.9mb

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

私有(private)内存增长了 42mb!

谁能对导致私有(private)内存增长的原因提供可能的解释?打开 Chrome 调试器是否会导致或影响内存增长?

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

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

最佳答案

我无法找到关于何时以及什么进入私有(private)内存与 javascript 内存的准确信息。但是我可以回答这个问题:“打开 chrome 调试器会影响这个吗”……是的。

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

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

关于javascript - chrome 私有(private)内存中无法解释的增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860440/

相关文章:

javascript - 使用扩展程序的 Chrome 自动化;点击按钮和填写表格

c++ - 具有动态内存的命名管道策略?

c - Pebble 在 `realloc` 上崩溃,但仅在特定函数中崩溃

javascript - 如果有足够的空间,D3 将弧形标签放在饼图中

javascript - 仅显示一组 sibling 中的两个 <br>

docker - 如何在 Dockerfile 中安装特定版本的 Chrome?

windows - 双击选择带连字符的单词

linux - smem如何计算RSS、USS和PSS?

javascript - 是否可以使用类向 React 组件添加内联样式?

javascript - Bootstrap Datepicker 未加载