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

Why doesn't node.js garbage collect system resources (such as file handles)?

本文关键字:系统资源 文件句柄 js node 为什么不      更新时间:2023-09-26

我在node.js上做了很多异步文件I/O工作,我突然意识到,必须非常小心地捕捉所有错误路径,以免在错误情况下意外泄露文件描述符。但是,Javascript是一种垃圾收集语言,这正是在垃圾收集环境中不应该担心的事情。

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

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

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

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

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

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

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

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