当前位置: 首页 > 面试题库 >

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

王棋
2023-03-14
问题内容

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

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

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

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

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

编辑

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

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

更新

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


问题答案:

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

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



 类似资料:
  • 我正在玩rxjava,发现如果在活动被销毁之前没有完成订阅,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅没有取消订阅,则此类情况的演示之一如下所示。已销毁(来源:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions

  • 应用程序可以持久化用户,以后可以修改。最近无法修改用户,引发了异常。用户实体被持久化,没有错误或验证。有人知道是什么导致了这种行为,或者我如何找到更多细节吗?

  • 问题内容: 我对Java线程技术比较陌生,并且我注意到,每次使用Thread.sleep()时,我都必须捕获InterrupetdException。 哪种行为会导致这种情况,并且在具有监视器线程的简单应用程序中,我可以忽略该异常吗? 问题答案: 好吧,如果其他一些线程调用thread.interupt(),则在该线程处于休眠状态时,您将获得Exception。是的,您可能只需将try..catc

  • 问题内容: 它与jQuery有何关系?我知道该库在内部使用本机javascript函数,但是每当出现此类问题时,它到底想做什么? 问题答案: 这意味着您已尝试将DOM节点插入到DOM树中无法移动的位置。我在Safari上看到的最常见的地方不允许以下内容: 通常,这只是实际意图中的一个错误: 常见的其他原因(从评论中总结): 您正在尝试将节点附加到自身 您正在尝试将null附加到节点 您试图将一个节

  • 我有一个连接到MySQL的服务方法,可以在中获取数据,最后在

  • 我正试着用Spring Boot和Hibernate做一个简单的登录应用程序,不同的是我用JSP代替了百里香。 虽然注册已成功进行,但在使用注册的电子邮件ID登录时,我收到瞬态DataAccessResourceException。 我对这篇文章的理解是,“spring.queries.users-query”属性(来自application.properties)需要1个参数(正如它应该的那样)