如题,我在https://cnodejs.org/topic/516b64596d38277306407936文章中看到这么一句话
我们通过中间件的形式,引入domain来处理异步中的异常。当然,domain虽然捕捉到了异常,但是还是由于异常而导致的堆栈丢失会导致内存泄漏,所以出现这种情况的时候还是需要重启这个进程的,有兴趣的同学可以去看看domain-middleware这个domain中间件。
我想知道为什么异常会导致堆栈退出而导致内存泄露?
node底层还是c/c++,v8构建的, 异常导致堆栈丢失 C++异常中的堆栈跟踪, 从而使用过的内存没有清理导致泄漏
@Tei320 但是我觉得js中的异常应该是v8引擎模拟的吧,而不是真的有c/c++引发的吧?
domain这个api已经被官方标记为抛弃了,就不要用了,如果出现未捕获异常,目前唯一的办法就是进程退出,重启。 自豪地采用 CNodeJS ionic
@XGHeaven v8就是用c和c++写的JS解释引擎,不过我也就是想想的,是信息安全专业的小菜鸟~
domain捕捉到的一般是unexpected error. 如果在抛出异常之前打开了file/net stream等io, 并且这些句柄因为unexpected的行为而未能正常关闭的话, 那么就会导致 resources leak.
所以, 我的理解, 这只是一种可能性. 并不是说domain捕捉到的异常, 就一定会导致内存泄露(我也在找时间实际测试一下效果).
另外, node并没有抛弃domain
这个模块, 目前只是一种’soft deprecation’, 因为他们还没有找到替代者. 而原则是, 只有找到替代者后, domain才会被抛弃, 所以, 先用着吧. 复杂的业务场景下, 没有domain怎么行呢?
@kiliwak 建议在看看正文里面的链接,domain解决不了问题。 自豪地采用 CNodeJS ionic
@fengmk2 我不同意您说的domain解决不了问题
. domain不能解决所有的问题(如正文里提到的以及您github上的一个例子), 但至少提供了一个比较友好的处理异步异常的选项. 这对提高整个web服务的可用性有显著作用. 当然, 在domain也处理不了的异常情况下, 可用uncaughtException
+forever
重启进程来应对(或者类似方案). 而这个时候, 说明还有一些意料之外的意料之外的异常, 这部分一般来说已经非常少见了