一尘不染

为什么异常会导致Node.js中的资源泄漏?

node.js

如果您查看Node.js
文档开头的域,则会指出:

本质上,throw在JavaScript中是如何工作的,几乎没有任何方法可以安全地“从上次中断的地方捡起”,而不会泄漏引用或创建其他未定义的脆性状态。

再次在代码示例中,它在第一部分中给出:

尽管我们阻止了进程的突然重启,但是我们正在疯狂泄漏资源

我想了解为什么会这样?哪些资源正在泄漏?他们建议您仅使用域来捕获错误并安全地关闭进程。这是所有例外的问题吗,不仅仅是在使用域时?在Javascript中引发和捕获异常是一种不好的做法吗?我知道这是Python中的常见模式。

编辑

我可以理解,如果引发异常,为什么使用非垃圾回收语言会导致资源泄漏,因为如果引发异常,则您可能要运行的用于清理对象的任何代码都不会运行。

我可以用Javascript想象的唯一原因是,如果引发异常,则将对变量的引用存储在引发异常的范围内(可能是调用堆栈中的内容),从而保留引用,然后将异常对象保存在周围,并且永不得到清理。除非提到的泄漏资源是引擎内部的资源。

更新

我写了一个博客,现在解释这个问题的答案要好一些。看看这个


阅读 233

收藏
2020-07-07

共1个答案

一尘不染

意外的异常是您需要担心的。如果您对应用程序的状态了解不足,无法添加针对特定异常的处理并管理任何必要的状态清除,那么根据定义,应用程序的状态是未定义的且不可知,并且很可能存在某些情况徘徊不应该。您不仅要担心内存泄漏。未知的应用程序状态可能会导致不可预测的应用程序行为(例如,传递错误的输出-
部分渲染的模板,不完整的计算结果,或者更糟糕的是随后的每个输出都出错的情况)。这就是为什么在发生未处理的异常时退出流程很重要的原因。它使您的应用有机会自行修复。

发生异常,这很好。接受它。关闭该过程,并使用诸如Forever之类的方法进行检测,并使事情回到正轨。集群和域也很棒。您正在阅读的文字不是在引发异常或在处理了预期的异常后继续该过程的警告,而是在发生意外异常时保持该过程运行的警告。

2020-07-07