【问题标题】:memory leak node/socketio chat内存泄漏节点/socketio 聊天
【发布时间】:2022-01-08 17:55:23
【问题描述】:

我们在 nodejs/socketIO 中内置了一个聊天功能,效果很好。我们使用 pm2 启动应用程序。 我们的监控显示我们的内存使用量在聊天交换期间增长缓慢且更多。 昨天我们有大约 1500 名用户在聊天,突然间内存占用了大约 200 MB ......并且一直保持这种状态。当聊天中的用户离开时,我们的使用量只是略有下降。

socketio 4.0.1 节点版本 10.24.0 pm2 版本 3.5.0 rhel 7

在我们开始“pm2 reload chat”之前,内存从未在夜间被释放。

我尝试检查内存使用情况: PID 用户 %MEM 命令 5195 根 2.4 节点 /appli/chatvideodiff/server/server.js 25836 root 0.3 PM2 v3.5.0:上帝守护进程(/root/.pm2)

节点总数:1285928K pm2 总计:913644K

并启动了一个 pmap 以获取更多信息。

没有任何问题,但我很想知道是什么导致了内存“泄漏”,所以如果你有想法的话。

谢谢 妮可

【问题讨论】:

  • 你必须删除你不再使用的变量这不是node.js的问题他有一个强大的垃圾收集器。这是您的程序的问题,如果可能,请避免循环引用,垃圾收集器找不到它们(可以找到但不确定,特别是当循环引用创建大而复杂的图形时
  • 感谢@tommaso 提供这些信息,我有几行“this”。在阅读一些论文时,我发现它们是循环参考。我还阅读了我可以尝试添加“使用严格”;在代码之上你在想什么?谢谢
  • 很难说,但可能是垃圾收集器在内存空间可用之前不会删除对象“或至少尝试找到这些引用”。 node.js 使用分代垃圾收集器,因此不会年轻的对象被检查的次数总是更少。如果您聊天很长时间保持活动状态,垃圾收集器会将这些对象放在保留区域中,并且该区域将被检查的时间更少,“作为抛出 OutOfMemoryError 之前的最后一个资源”。对象 ref 存在的越多,它就越会忽略它们。或者它可能是你的代码错误我不知道我没有你的鳕鱼

标签: node.js socket.io pm2


【解决方案1】:

这也是我遇到的问题。我想出了一个解决方案:

require('expose-gc') npm 模块。

Nodejs 有一个内置的垃圾回收方法..

global.gc();

这种方法会从您的记忆中删除任何不需要的对象。因此,请在 setInterval timelimit 上运行代码以限制您运行代码的时间限制。

 setInterval(function(){
             global.gc();
},10000);

使用此过程清洁您的 RAM。 请要求expose-gc npm 模块。


【讨论】:

    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2020-11-15
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多