我有这个使用太多内存的NodeJS应用程序。我们正在努力追踪问题的根源。
所以我读到闭包对内存使用不利。垃圾收集器很难释放闭包使用的内存。
我们的代码有很多部分使用像这样的承诺:
thenableFunction().then(() => {...}).then(() => {...}).catch(() => {...});
所以在阅读了关于闭包的内容后,我想重构一切
try{
let result = await thenableFunction();
...
}catch(e){...}
我现在想知道我们是否会从这种重构中受益,或者它毕竟没有任何区别。
你怎么看?你知道解释这个的好链接吗?感谢
答案 0 :(得分:1)
await
实际上就是你正在替换的代码的语法糖(好吧,除了你的代码块之后的所有代码都被有效地提取到then子句中 - 是await
关键字在Promise
结算之前有效阻止执行的方式。因此,这种重构不应该真正影响内存消耗。
问题的具体答案取决于两个问题。首先,重写是否避免了闭包(在原始代码中是明确的),第二个(假设第一个的答案是肯定的),垃圾收集器是否会失败到GC闭包以及它做了Promise正在做的事情(如果它没有隐含地创建闭包)。
我非常确定第一个问题的答案是否定的 - await Promise
确实创建了隐式闭包。所以我不认为你首先要避开它们。
关于第二个问题,从我的阅读来看,在某些特定情况下,闭包只会导致奇怪的垃圾收集问题(即泄漏):
https://www.ibm.com/developerworks/library/wa-use-javascript-closures-efficiently/index.html
https://auth0.com/blog/four-types-of-leaks-in-your-javascript-code-and-how-to-get-rid-of-them/
因此,除非您对闭包的使用与某些模式相匹配,否则我认为即使您的Promise不会隐式创建相同的闭包,您仍然会遇到类似的GC行为。