随着javascript websockets的使用,内存使用量逐渐增加。为啥?

Posted

技术标签:

【中文标题】随着javascript websockets的使用,内存使用量逐渐增加。为啥?【英文标题】:Memory usage is gradually increasing with javascript websockets.Why?随着javascript websockets的使用,内存使用量逐渐增加。为什么? 【发布时间】:2018-11-29 05:23:18 【问题描述】:

我有一个使用 javascript websockets 来获取和呈现实时数据的 web 应用程序。问题是一旦 websocket 连接建立,我的浏览器的内存使用量逐渐增加(以 MB 为单位)。 关闭选项卡后,内存使用量下降的数量与增加的数量相同。 我也将通过 websockets 接收到的数据渲染到谷歌图表,并且每 2 秒接收一次数据,触发使用新数据重新渲染图表。这可能是问题吗?还是 websockets 导致内存使用量增加?

【问题讨论】:

【参考方案1】:

如果不深入了解您的应用并查看您的代码并可能按如下所述对其进行检测,我们就无法具体了解导致此问题的原因。

这不是 webSockets 的普遍问题。 webSockets 可以打开并接收数据多年而不会导致内存增加。

这些问题可以通过以下方法解决:

    代码检查(找到数据无限积累的地方) 查找有关有类似问题的人的文章并查看他们的解决方案,看看它们是否适用于您 获取堆快照的指令,将它们与以前的快照进行比较,查看正在积累的对象类型,然后使用这些知识来查找数据积累的来源。

请参阅 Chrome 中的 How to Record Heap Snapshots 以获取有关进行内存使用调试的非常详细的描述。根据我们对您的具体案例的限制信息,没有什么比我们可以告诉您更具体的了。

您可以通过不连接您的 webSocket 来完全消除等式中的 webSocket,然后通过运行setInterval() 并一遍又一遍地重新渲染您的图表来模拟从 webSocket 获取数据。这至少可以消除您的一些代码作为嫌疑人。

仅供参考,这里有几篇其他文章可供参考:

Memory leak using google charts with ajax

Memory leak in google line charts

Quick tips for squeezing memory leaks out of Google's Javascript charts with live (continuous) data/streams

Profiling memory usage in Chrome

【讨论】:

【参考方案2】:

我发现了问题所在。 感谢@jFriend00 的指导。

在阅读了一些博客/帖子/文章之后,我认为问题出在 websocket 上,然后在此处发布了问题。

我重新检查了我的代码,发现问题在于每秒重新渲染图表。我正在创建图表的新实例以每秒渲染一次。我希望 GC 能够完成清理旧图表的工作图表,但事实并非如此。

我修改了我的代码以清除现有图表并使用新数据呈现相同的图表,瞧!我的内存消耗已恢复正常。

【讨论】:

以上是关于随着javascript websockets的使用,内存使用量逐渐增加。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 的使?

javascript jQuery的使わずトグルクラス

javascript之ProtoBuf在websocket中的使用

javascript之ProtoBuf在websocket中的使用

css如何不改变原位置的使多个图片在原地动画

PHP 简单的网络套接字