我认为当连接 x 个 EventSource 客户端时,我遇到了 Express 应用程序的内存泄漏。连接客户端并向它们发送 x 条消息并断开连接后,我的 Express 应用仅释放少量已分配的堆/RSS。
为了证实这一点,我在启动服务器时保存了一个Heapdump,并在连接了 7,000 个客户端并向每个客户端发送 x 条消息后保存了一个。在拍摄堆快照之前,我等了一会儿,让 GC 有机会进行清理。
为了比较这些堆快照,我将它们加载到 Chrome 开发者工具配置文件 View 中并选择了“比较”模式。
我的问题是:
1) 如何解读这些数字? (有关引用,请参阅随附的堆快照屏幕截图。)
2) 例如,Socket 对象似乎根本没有释放任何对象,对吗?
3)你能给我更多的提示来调查这个问题吗?
最佳答案
您可以避免内存泄漏,并且避免使用垃圾收集器。 您所要做的就是对象轮询。
你可以做类似的事情
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/