获得徽章 11
赞了这篇文章
赞了这篇文章
赞了这篇文章
V8引擎内存管理GC中, 使用到了mark-sweep算法,通过判断可达性来查找不再使用的对象,这个算法能够很好的解决循环依赖的问题,而在闭包中,因为函数与其包围的作用域环境形成了闭包,当我们执行一个使用了闭包的函数的时候,执行函数,函数进入执行上下文栈,此时函数会在栈顶形成自己的FEC(Function Execution Context),栈内同样会包含作用域链,JavaScript执行原理中,因为每个上下文会维护一个VO(Variable Object),而函数的拥有自己的上下文,其VO是函数的AO对象(Activation Object),内部会存储函数上下文中定义的变量、以及argument,当函数访问了外部变量后,查找规则为,会先从AO中查找,找不到则从作用域链中去查找,作用域链会从函数定义的上下文开始(不包含),包含其向外一层一层的上下文VO,这样去查找变量,由于函数作用域链中维持了外部函数的VO对象,所以外层函数的上下文信息会被保存不会释放(部分会被V8优化),这样就能够实现闭包,而也是因此,对象没有得到及时的释放,容易造成内存泄漏(OOM),所以对于闭包的使用上,我们应该即使的给闭包相关的引用置为null,这样就断开了mark-sweep算法中维持的图结构中,节点的联系,使得需要释放的对象在图中不可达,失去引用,从而被释放
展开
评论
点赞
![[可怜]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_5.ece2a96.png)