gpt4 book ai didi

node.js - 我们应该使用 Async/Await 还是 Then 闭包来避免内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:52 24 4
gpt4 key购买 nike

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

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

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

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

因此,在阅读了有关闭包的内容后,我想将所有内容重构为

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

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

你觉得怎么样?您知道有什么好的链接可以解释这一点吗?

谢谢

最佳答案

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

关于node.js - 我们应该使用 Async/Await 还是 Then 闭包来避免内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50353815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com