为什么 node.js 不垃圾收集系统资源(比如文件句柄)?

jfr*_*d00 6 javascript garbage-collection node.js

我一直在 node.js 上做一堆异步文件 I/O 工作,让我震惊的是,必须非常小心地捕获所有错误路径,以免在错误情况下意外泄漏文件描述符。但是,Javascript 是一种垃圾收集语言,这正是您在垃圾收集环境中不必担心的事情。

如果保存文件描述符的变量超出范围或无法从您的代码访问,那么 node.js 垃圾收集器似乎应该知道并为您正确清理系统资源。浏览器中的 Javascript 使用 DOM 对象执行此操作。如果一个 DOM 对象已从 DOM 中删除并保存在一个 Javascript 变量中,然后超出范围或变得无法访问,浏览器将自动为您清理它。您不必手动删除它。因此,与非 JS 资源的这种级别的集成当然是可能的。

所以,我想知道为什么 node.js 没有这个功能,因为它看起来非常有用并且会使其成为一个更强大的服务器开发环境?

这是否只是 node.js 处于早期开发阶段的一个例子,随着时间的推移,这可能是一个合乎逻辑的改进,但现在还有更重要的事情要做?

这是 node.js 与 V8 引擎保持一定距离的情况,因此没有集成到垃圾收集系统句柄所需的级别吗?

是否存在一些概念上的困难,使得对文件句柄或其他系统资源进行 GC 变得不切实际?

Aar*_*our 2

正如 jfriend00 所说,文件描述符只是节点中的数字这一事实使其成为一个问题。文件描述符可能已被复制,并且无法跟踪这一点。

此外,来自主进程的文件描述符可以与子进程共享(请参阅cluster模块),这意味着即使进程可以确定不再有对特定文件描述符的引用,不同的进程也可能拥有它的副本。

文件描述符以这种方式可共享的要求可能是推动文件描述符作为数字决策的原因,因为不可能在进程之间传递具有不可见内部结构的对象。