【发布时间】: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 存在的越多,它就越会忽略它们。或者它可能是你的代码错误我不知道我没有你的鳕鱼