这段代码做了一件事:每次WordStrThing被调用,theThing获得一个包含大年夜数组和新的闭包(someMethod)的对象。同时,变量unused保持了一个引用originalThing(theThing是前次调用WordStrThing生成的值)的闭包。已经有点困惑了吧?最重要的工作是一旦为同一父域中的感化域产生闭包,则该感化域是共享的。
这里,感化域产生了闭包,someMethod和unused共享这个闭包中的内存。unused引用了originalThing。尽管unused不会被应用,someMethod可以经由过程theThing来应用WordStrThing感化域外的变量(例如某些全局的)。并且someMethod和unused有合营的闭包感化域,unused对originalThing的引用强迫oriiginalThing保持激活状况(两个闭包共享全部感化域)。这阻拦了它的收受接收。
当这段代码反复履行,可以不雅察到被应用的内存在持续增长。垃圾收受接收运行的时刻也不会变小。大年夜本质上来说,闭包的连接列表已经创建了(以theThing变量为根),这些闭包每个感化域都借居引用了大年夜数组,导致大年夜量的内存泄漏。
这个问题被Meteor团队发明,他们有一篇异常好的文┞仿描述了闭包大年夜量的细节。
4: DOM外引用
有的时刻在数据构造里存储DOM节点是异常有效的,比如你想要快速更新一ㄗ莨狁几行的内容。此时存储每一行的DOM节点的引用在一个字典或者数组里是有意义的。此时一个DOM节点有两个引用:一个在dom树中,别的一个在字典中。如不雅在将来的某个时刻你想要去移除这些排,你须要确保两个引用都弗成达到。
这是最简单的垃圾收受接收算法。 一个对象在没有其他的引用指向它的时刻就被认为“可被收受接收的”。
- var elements = {
- button: document.getElementById('button'),
- image: document.getElementById('image')
- };
- function doStuff() {
- image.src = 'http://example.com/image_name.png';
- }
- function removeImage() {
- //image是body元素的子节点
- document.body.removeChild(document.getElementById('image'));
- //这个时刻我们在全局的elements对象里仍然有一个对#button的引用。
- //换句话说,buttom元素仍然在内存中并且不克不及被收受接收。
- }
经由过程SessionStack,你可以回放应用中的问题,看到问题对用户的影响。所有这些都不会对你的应用产生机能的影响。因为用户可以从新加载页面或者在应用中跳转,所有的不雅察者、拦截器、变量分派都必须合理处理。以免造成内存泄漏,也预防增长全部应用的内存占用。
推荐阅读
微软雅黑升级:Windows 10 RS4快速预览版17025更新内容大全
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!改良微软雅黑字体:正如大年夜中国Windows Insider会员收集的反馈,微软雅黑是用中文(简体)说话来显示Windows UI文本的字>>>详细阅读
本文标题:如何处理JavaScript内存泄露
地址:http://www.17bianji.com/lsqh/38229.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示