js内存泄漏

造成内存泄露的原因之一为啥有一种是意外的全局变量引起的内存泄露呢?正常var声明的变量多了不也是会内存泄漏吗?为啥强调意外的未声明的呢?求教

阅读 2k
2 个回答

正常使用的不算内存泄漏。申请的变量如果未被引用,也会被垃圾回收。但是有些是未经注意引用了,导致原本无用的变量无法正确释放,导致内存不断增长,这才是内存泄漏。

因为内存泄漏是因为原本应该释放的资源没有正确释放导致的,所以内存会不断增长。如果将一段会使内存泄漏的代码,放到一个数量级巨大的循环中,是很容易看到内存不断增长的。而正确引用和释放的引用,在多次循环中,在循环作用域外的引用不会被释放,但是也不会增长,而在每个单独循环作用域中的引用,由于后续循环不再引用,如果正确释放将被垃圾回收。所以引用处理正确的代码,占用内存不会持续增长,常会表现出不断减少,或者周期循环的特性。

执行 javascript 的引擎 有 GC(垃圾回收)机制,那些声明了未使用的变量所占用的内存每过一段时间就会被“回收”掉了,这个很好理解,占着茅坑不拉屎的,肯定是要让给那些想要拉屎的,扯远了。

但这些内存能被回收的前提是,引擎能够识别出它们是真正意义上的垃圾,javascript 引擎的垃圾回收算法比较常用的一种是引用计数法,简单描述的话就是,声明一个变量之后,每当这个变量被引用一次,它的引用计数就加一,反之减一,然后每过一段时间,引用计数为零的那些变量所占的内存就会被回收。

但是有些情况下,计数是不会自动减少的,比如:

document.addEventListener('click', foo)

这里这个 foo,如果不通过 removeEventListener 将它从 document 上移除,被 foo 占用的内存永远也不会被释放。

同理 window.foo 这样的声明方式也是类似的,如果你不通过 window.foo = undefined 这样的语句移除这个引用,它占用的内存资源将永远不会被释放。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题