【发布时间】:2014-10-31 21:46:42
【问题描述】:
我不希望 DB 请求在连接前意外运行,因此 connect 方法返回一个 promise,并且每个 DB 方法都使用 connectPromise.then()。
似乎我的应用程序正在泄漏内存,所以我想知道这是否是原因。 v8 堆内存快照中的头号违规者标题为sql,其中包含很多来自 bluebird 承诺和域的内容。我真的不知道该怎么做,但我想到了一个连接承诺。
编辑:我已经确认问题的根源确实是我遵守续集承诺的做法。为了测试,我尝试每 30 秒刷新一次该承诺,我的应用程序停止收集越来越多的内存。
我开了一个issue in sequelize
【问题讨论】:
-
与其他 Promise 相比,Bluebird Promise 的大小很小(与原生 Promise 相比也是如此)。也就是说,泄漏总是可能的,并且没有代码是错误安全的。您是否有可能保留对您创建的所有承诺的引用?
-
在v8快照的最顶部,有一个叫做“sql”的对象,不知道它的名字是怎么来的。它所拥有的只是对错误、域和承诺的引用。
-
这听起来可能很奇怪 - 但您能否将 Bluebird 更新到最新版本,看看问题是否消失?
-
我不确定是不是这样,但是 v8 快照将我带到了这个文件,它提到了事件和承诺,并在关键“sql”下的承诺内部存储了东西 - sequelize promise code
-
Sequelize dev here,肯定存在sequelize 的漏洞,因为当我们主要转向promises 时,我们想为sql 事件维护BC。我们将在 GH 问题上寻找一个可能的解决方案,它肯定可以处理长期解决的承诺。
标签: node.js memory-leaks garbage-collection sequelize.js bluebird