为什么js中会产生堆栈丢失而导致内存泄露的情况?
发布于 9 年前 作者 XGHeaven 4200 次浏览 最后一次编辑是 8 年前 来自 问答

如题,我在https://cnodejs.org/topic/516b64596d38277306407936文章中看到这么一句话

我们通过中间件的形式,引入domain来处理异步中的异常。当然,domain虽然捕捉到了异常,但是还是由于异常而导致的堆栈丢失会导致内存泄漏,所以出现这种情况的时候还是需要重启这个进程的,有兴趣的同学可以去看看domain-middleware这个domain中间件。

我想知道为什么异常会导致堆栈退出而导致内存泄露?

7 回复

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重启进程来应对(或者类似方案). 而这个时候, 说明还有一些意料之外的意料之外的异常, 这部分一般来说已经非常少见了

回到顶部