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

rou*_*bin 7 memory-leaks node.js express server-sent-events

当我将多个EventSource客户端连接到它时,我想我正在使用Express应用程序遇到内存泄漏.在连接客户端并向其发送x消息并断开它们之后,我的Express应用程序仅释放少量分配的Heap/RSS.

为了确认这一点,我在启动服务器时保存了一个Heapdump,在连接了7,000个客户端并向每个客户端发送x消息之后保存了一个.在等待堆快照之前,我等待了一段时间让GC有机会进行清理.

为了比较这些堆快照,我将它们加载到Chrome开发者工具配置文件视图中,然后选择"比较"模式.

我的问题是:

1)如何解释这些数字? (有关参考,请参阅附加的堆快照截图.)

2)例如,看起来Socket对象几乎没有释放任何对象,这是正确的吗?

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

堆快照Express.js应用程序

Mag*_*gus 1

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

你可以做类似的事情

var clientsPool = new Array(1000);
var clientsConnected = [];
Run Code Online (Sandbox Code Playgroud)

当新客户端连接时,您会执行以下操作

var newClient = clientsPool.pop();
//set your props here
clientsConnected.push(newClient);
Run Code Online (Sandbox Code Playgroud)

这是避免垃圾收集器并防止内存泄漏的好方法。当然,还有更多的工作要做,您必须仔细管理,但这对于性能来说是完全值得的。

有一个很棒的讨论,请看这里 https://www.youtube.com/watch?v=RWmzxyMf2cE