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

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

共享内存 – 21.7 mb

私人记忆60.9mb

正如您所看到的,JS堆只增长了200k.

私人记忆增长了42mb!

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

一个想法是强制GC从时间线调试器只从JS堆中回收内存 – 所以其他内存没有被回收.因此,这可能不是“泄漏”本身,因为它最终可能被收集 – 虽然我不知道如何确认这一点.特别是不知道这个记忆代表什么.

最后,我确实读到xhr结果也存储在私有内存中.有没有人知道这是不是真的?如果是这样,该应用确实在这段时间内执行了大约5700 xhr的请求.如果42mb中的大部分是由于这个原因,这将意味着大约7k被分配 – 考虑到有效载荷非常小,这似乎很高.如果是这样的话;什么时候会释放这个内存,我有什么办法可以让它被释放,并且让chrome调试器打开会影响这个吗?

最佳答案
我无法找到关于何时以及什么进入私人记忆与javascript记忆的信息.但是我可以回答这个问题:“让Chrome调试器打开会影响这个”……是的.

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

您可以打开开发工具,触发GC,然后关闭开发工具,再次打开它们以在需要获取指标时触发GC.此外,您可以使用此sucker chrome:// memory-redirect /来跟踪增长情况,而无需打开开发工具.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...