node.js - 带有 EventSource 的 Express.js 中的内存泄漏

标签 node.js express memory-leaks server-sent-events

我认为当连接 x 个 EventSource 客户端时,我遇到了 Express 应用程序的内存泄漏。连接客户端并向它们发送 x 条消息并断开连接后,我的 Express 应用仅释放少量已分配的堆/RSS。

为了证实这一点,我在启动服务器时保存了一个Heapdump,并在连接了 7,000 个客户端并向每个客户端发送 x 条消息后保存了一个。在拍摄堆快照之前,我等了一会儿,让 GC 有机会进行清理。

为了比较这些堆快照,我将它们加载到 Chrome 开发者工具配置文件 View 中并选择了“比较”模式。

我的问题是:

1) 如何解读这些数字? (有关引用,请参阅随附的堆快照屏幕截图。)

2) 例如,Socket 对象似乎根本没有释放任何对象,对吗?

3)你能给我更多的提示来调查这个问题吗?

Heap Snapshot Express.js app

最佳答案

您可以避免内存泄漏,并且避免使用垃圾收集器。 您所要做的就是对象轮询。

你可以做类似的事情

var clientsPool = new Array(1000);
var clientsConnected = [];

当一个新客户端连接时,你做

var newClient = clientsPool.pop();
//set your props here
clientsConnected.push(newClient);

这是避免垃圾收集器和防止内存泄漏的好方法。当然,还有一些工作要做,您必须小心管理,但为了性能,这是完全值得的。

关于它的讨论很棒,给你 https://www.youtube.com/watch?v=RWmzxyMf2cE

关于node.js - 带有 EventSource 的 Express.js 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835061/

相关文章:

javascript - Express.js 找不到样式表

javascript - Node.js 性能瓶颈

eclipse - Eclipse RCP 应用程序中的内存泄漏

javascript - Model.function 不是路由器内的函数

node.js - 相同的Azure功能,相同的输入,不同的租户,不同的输出

ajax - 如何一次测试/发送多个(假)ajax 请求到(node.js)服务器?

javascript - Nightmare.js 在 Ubuntu Linux 云服务器上没有按预期工作

javascript - 为什么 express-js 不设置 Content-Type header ?

C++ vector 内存不足

objective-c - 无法弄清楚内存泄漏从何而来