【发布时间】: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) => { res.json({"songs": jsonObj}); }回调也是一个闭包。
标签: javascript memory-leaks closures