Node.js + Socket.io:连接断开时泄漏内存

背后故事的位:

我的Node应用程序,名为Sleepychat(在生产中,在Heroku上托pipe)最近开始报告内存限制达到的错误(在512MB)。 幸运的是,Heroku允许这个,直到达到5次才会崩溃应用程序,所以这很好。 不过,我觉得奇怪的是,这只是在最近推向Heroku之后才发生的,只不过是增加一个页面而已。 我的理论是,Heroku可能在更新上使用了更新版本的Node,但似乎并非如此。 我降级,错误仍然发生。

我的来源可以在GitHub上find 。 185行是连接代码,1553行是断开连接代码。

现在,我有一些时间来运行使用New Relic和Node Inspector的代码来分析它,并且似乎任何连接,无论是允许的,还是立即拒绝和断开连接,都会分配less量的内存断开。

例如,我导航到本地主机,页面连接到文档准备就绪,New Relic显示内存略有增加。 通常大约500kb(这对我来说仍然很大,但我猜这主要是套接字对象)。 当我断开连接时,New Relic没有发生变化。 更有趣的是,我可以垃圾网页刷新,以迅速激增内存使用量。 早些时候我提到连接是否被拒绝并不重要。 通过这个,我的意思是在15秒内互相连接3次后,网站会立即拒绝新的连接并断开连接。

尽pipe如此,页面刷新(自动连接)增加了RAM。 我已经看了很多次,看看我是不是发布了一些东西,但据我所知,一切都应该由范围来pipe理,所以我不知道是什么东西在泄漏。

不过,我注意到一些奇怪的行为,一旦我添加了New Relic。 首先,一旦Sleepychat达到了512MB的极限,Heroku会报告一个内存限制达到的错误,但是New Relic会显示好像一个大块(〜100MB)已经释放。 尽pipe如此,Heroku稍后还会报告更高的使用率。 其次,每当我使用节点检查器logging堆分配时,New Relic报告内存使用量的下降,但是一旦我停止logging就会立即恢复。

这是来自Node Inspector的一个快照文件(实际上是一个分配时间表)。 当我启动垃圾邮件页面刷新10秒。 另外,这里是New Relic报道的图片。

快照: 快照文件

新的遗物:

我不知道发生了什么事。 有人有主意吗?