【发布时间】:2013-03-27 09:15:43
【问题描述】:
如果您查看 Node.js documentation for domains 的开头,它会声明:
由于 throw 在 JavaScript 中的工作原理,几乎没有任何方法可以安全地“从上次中断的地方继续”,而不会泄漏引用或创建其他类型的未定义脆弱状态。
再次在第一部分给出的代码示例中说:
虽然我们阻止了进程突然重启,但我们正在疯狂地泄漏资源
我想了解为什么会这样?哪些资源正在泄漏?他们建议您仅使用域来捕获错误并安全地关闭进程。这是所有例外的问题,而不仅仅是在使用域时?在 Javascript 中抛出和捕获异常是一种不好的做法吗?我知道这是 Python 中的常见模式。
编辑
我可以理解为什么如果您抛出异常,非垃圾收集语言中可能会出现资源泄漏,因为如果抛出异常,您可能运行来清理对象的任何代码都不会运行。
我能用 Javascript 想象的唯一原因是,如果抛出异常会将对变量的引用存储在引发异常的范围内(可能还有调用堆栈中的东西),从而保留引用,然后保留异常对象周围,永远不会被清理干净。除非提到的泄漏资源是引擎内部的资源。
更新
我写了一篇博客来解释这个问题的答案现在更好了。 Check it out
【问题讨论】:
-
你觉得这个问题很有用stackoverflow.com/questions/14301839/…
-
不幸的是,这个问题只是谈论使用域来捕获异步异常。它根本没有提到内存泄漏。
-
这就是为什么它是评论而不是答案 :) 这是如何使域尝试/捕获更容易使用。至于问题,是关于封闭泄漏。你抛出一个异常,但是你有一个请求对象,它在一个事件中仍然有一个引用,并且该事件有对请求对象的引用,并且这两个不是垃圾收集的。例如,如果您有一个 MongoDB 连接,但由于抛出异常而没有关闭,它可能会隐式保持打开状态。
-
好点。因此,如果这是唯一的问题,那么听起来资源泄漏仅限于在有打开的流(套接字、文件等)的代码段中引发的异常。如果这是真的,我希望他们能更好地解释它,因为这样程序员就可以考虑到它。听起来 Javascript 需要 Python 的上下文管理器之类的东西。
-
虽然,垃圾收集器是为处理循环引用而构建的,所以一旦任何打开的流超出范围并且剩下的唯一引用是循环的,我认为它应该能够自动检测到这一点关闭信息流。
标签: javascript node.js exception memory-management memory-leaks