内存泄漏Express.js与EventSource

当我连接x个EventSource客户端时,我想我正在运行一个Express应用程序的内存泄漏。 连接客户端并发送消息并断开连接之后,我的Express应用程序仅释放less量分配的Heap / RSS。

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

为了比较这些堆快照,我在Chrome Developer Tools Profile视图中加载了这些快照,并select了“比较”模式。

我的问题是:

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

2)例如,它看起来像是Socket对象几乎不释放任何对象,是正确的吗?

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

堆快照Express.js应用程序

你可以没有内存泄漏,作为奖金避免垃圾回收。 你所要做的就是对象轮询。

你可以做类似的事情

 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

至于我的评论…

JavaScript不能清理一段内存,如果有什么东西在2年前指向它的话,有人发现了一个漏洞,它很快就被closures了,就像这样

 var someData = ["THIS IS SOME DATA SAY IT WAS THE SIZE OF A SMALL APPLICATION"]; var somePointer = someData[0]; delete someData; 

然后他们将一个应用程序注入到一个指针中,因为当时没有数据时,它是对一个内存位置的引用。 嘿presto你注入记忆。

所以如果有像上面somePointer = someData[0];的引用somePointer = someData[0]; 你不能释放内存,直到你delete someData所以你必须删除所有你想要清理的东西的引用ALL_CLIENTS.push(this); 在线64正在使您的系统内存通过ALL_CLIENTS访问,所以你可以做的是

157行

 _.each(ALL_CLIENTS, function(client, i) { var u; // holds a undefined value (null, empty, nothing) client.close(); //delete ALL_CLIENTS[i]; ALL_CLIENTS[i] = u; ALL_CLIENTS.unused++; }); 

在另一个说明这不是一个内存泄漏内存泄漏是说,你有这个服务器,你closures它,如果内存没有释放后,你退出它然后你有一个内存泄漏,如果它清理它背后的内存它是不是泄漏只是内存pipe理不善

感谢@Magus指出,删除不是你可以使用的最好的东西,但我永远不会build议你实现一个限制结构,但你可以尝试

第27行: ALL_CLIENTS.unused = 0;

64行:

 var u; if(ALL_CLIENTS.unused > 0){ for(var i = 0; i < ALL_CLIENTS.length; i++){ if(ALL_CLIENTS[i] == u){ ALL_CLIENTS[i] = this; ALL_CLIENTS.unused--; i = ALL_CLIENTS.length; } } }else{ ALL_CLIENTS.push(this); }