为了账号安全,请及时绑定邮箱和手机立即绑定

在线等!js内存泄漏谢谢哈~

在线等!js内存泄漏谢谢哈~

慕斯709654 2019-09-25 15:32:05
造成内存泄露的原因之一为啥有一种是意外的全局变量引起的内存泄露呢?正常var声明的变量多了不也是会内存泄漏吗?为啥强调意外的未声明的呢?求教
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

正常使用的不算内存泄漏。申请的变量如果未被引用,也会被垃圾回收。但是有些是未经注意引用了,导致原本无用的变量无法正确释放,导致内存不断增长,这才是内存泄漏。
因为内存泄漏是因为原本应该释放的资源没有正确释放导致的,所以内存会不断增长。如果将一段会使内存泄漏的代码,放到一个数量级巨大的循环中,是很容易看到内存不断增长的。而正确引用和释放的引用,在多次循环中,在循环作用域外的引用不会被释放,但是也不会增长,而在每个单独循环作用域中的引用,由于后续循环不再引用,如果正确释放将被垃圾回收。所以引用处理正确的代码,占用内存不会持续增长,常会表现出不断减少,或者周期循环的特性。
                            
查看完整回答
反对 回复 2019-09-25
?
湖上湖

TA贡献2003条经验 获得超2个赞

执行javascript的引擎有GC(垃圾回收)机制,那些声明了未使用的变量所占用的内存每过一段时间就会被“回收”掉了,这个很好理解,占着茅坑不拉屎的,肯定是要让给那些想要拉屎的,扯远了。
但这些内存能被回收的前提是,引擎能够识别出它们是真正意义上的垃圾,javascript引擎的垃圾回收算法比较常用的一种是引用计数法,简单描述的话就是,声明一个变量之后,每当这个变量被引用一次,它的引用计数就加一,反之减一,然后每过一段时间,引用计数为零的那些变量所占的内存就会被回收。
但是有些情况下,计数是不会自动减少的,比如:
document.addEventListener('click',foo)
这里这个foo,如果不通过removeEventListener将它从document上移除,被foo占用的内存永远也不会被释放。
同理window.foo这样的声明方式也是类似的,如果你不通过window.foo=undefined这样的语句移除这个引用,它占用的内存资源将永远不会被释放。
                            
查看完整回答
反对 回复 2019-09-25
  • 2 回答
  • 0 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信