在Node.js堆检查器中,全局句柄和GC根是什么?

6

我正在尝试检查正在运行的Express Node.js应用程序的堆。

在堆转储比较中,看起来有些字符串没有被释放。它们绑定的承诺已经解决,但Retainers链向全局句柄,然后到GC根。我不明白这些是什么意思。

有人能够解释一下吗? 为什么GC无法收集这些已解决的承诺?

Node.js堆快照

1个回答

1
Node在启用async_hooks时会保存对每个Promise的引用,以及已拒绝的Promise,以便显示未处理的拒绝警告。
PromiseWrap是async_hooks使用的内容,而那个随机数组是未处理拒绝跟踪使用的数组。
请注意,无法禁用未处理拒绝跟踪 :(,但您可以放心,它们会被负责任地清理。

好的,但是当我运行GC时,内存没有被释放。我正在使用--inspect 标志在node.js和chrome中生成这些堆。 - Ali
@Ali 对,因为Node仍然在内部持有它们。 - snek
1
@snek 这是否意味着这是一种内存泄漏形式,或者它只是为了剖析而被保留;例如使用 --trace 标志会导致 Node 保留它们? - specifically_user3827668

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接