【问题标题】:ExpressJS memory leak caused by using closure?使用闭包导致 ExpressJS 内存泄漏?
【发布时间】:2018-11-12 09:41:05
【问题描述】:

我刚刚了解了 JS 中的闭包,很高兴能在我的项目中尝试它。 我编写了以下代码作为时间检查缓存是否过期。

module.exports = {
needUpdateCache: function () {
    let start = -1;
    const timeoutMs = rDefines["10_MINUTES_MS"];
    return function () {
        if (start === -1) {
            start = Date.now();
            return true;
        }
        let diff = Date.now() - start;
        if (diff < timeoutMs) {
            return false
        } else {
            start = Date.now();
            return true;
        }
    }
}(),

然后在主路由控制器中,我这样调用它

exports.getData = function (req, res, next) {

if (!common.needUpdateCache()) {
    console.log('Still in caching period. Retrieve from saved local file');
    common.csvFile2jsonArray("data.txt").then((jsonObj) => {
        res.json({"songs": jsonObj});
    });
    return;
}
else // get new data from db and save it to local file data.txt

我之所以认为我的代码中的闭包是罪魁祸首,是因为 heapdump 比较显示了许多由未收集创建的闭包,这导致 pm2 显示内存使用量增加。这是堆转储的快照

我对闭包和内存泄漏进行了研究,但不知道为什么我的代码会造成泄漏。我已经通过删除闭包的使用来修复它。但是,我真的很好奇为什么我的代码会出现内存泄漏。如果您有任何线索,请帮助指出,以便我将来注意。任何帮助表示赞赏。

【问题讨论】:

  • 您将需要检查究竟是哪个闭包是罪魁祸首,以及它关闭了哪些数据。在您发布的代码中,没有明显的错误。
  • 我只知道那个地方使用了闭包。扩展 heapdump,详细了解闭包的每个节点我看不到这些闭包的创建位置(或者我可能没有足够的经验检查 heapdump 文件)如果我包含 heapdump 文件有帮助吗?
  • 几乎每个函数都是一个闭包,因为闭包的创建在 JS 中是隐含的。例如。 (jsonObj) =&gt; { res.json({"songs": jsonObj}); } 回调也是一个闭包。

标签: javascript memory-leaks closures


【解决方案1】:

我终于通过删除提到的闭包部分消除了我的应用程序中的内存泄漏问题。之后似乎解决了内存泄漏。 但是我还必须删除有时会导致应用程序挂起的中间件 express-foridable。 现在我的应用程序正在运行而没有泄漏 感谢 Bergi 的评论,非常感谢。

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多