我们应该使用Async / Await还是Then Closures来避免内存泄漏?

时间:2018-05-15 15:18:28

标签: node.js memory-leaks promise async-await

我有这个使用太多内存的NodeJS应用程序。我们正在努力追踪问题的根源。

所以我读到闭包对内存使用不利。垃圾收集器很难释放闭包使用的内存。

我们的代码有很多部分使用像这样的承诺:

thenableFunction().then(() => {...}).then(() => {...}).catch(() => {...});

所以在阅读了关于闭包的内容后,我想重构一切

try{
    let result = await thenableFunction();
    ...
}catch(e){...}

我现在想知道我们是否会从这种重构中受益,或者它毕竟没有任何区别。

你怎么看?你知道解释这个的好链接吗?

感谢

1 个答案:

答案 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行为。