作家
登录

如何处理JavaScript内存泄露

作者: 来源: 2017-10-26 09:46:23 阅读 我要评论

  •   
  • var WordStrThing = function () { 
  •   
  •   var originalThing = theThing; 
  •   var unused = function () { 
  •     if (originalThing) // 引用'originalThing' 
  •       console.log("hi"); 
  •   }; 
  •   
  •   theThing = { 
  •     longStr: new Array(1000000).join('*'), 
  •     someMethod: function () { 
  •       console.log("message"); 
  •     } 
  •   }; 
  • }; 
  •   
  • setInterval(WordStrThing, 1000); 
  • 这段代码做了一件事:每次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树中,别的一个在字典中。如不雅在将来的某个时刻你想要去移除这些排,你须要确保两个引用都弗成达到。

    这是最简单的垃圾收受接收算法。 一个对象在没有其他的引用指向它的时刻就被认为“可被收受接收的”。

    1. var elements = { 
    2.     button: document.getElementById('button'), 
    3.     image: document.getElementById('image'
    4. }; 
    5.   
    6. function doStuff() { 
    7.     image.src = 'http://example.com/image_name.png'
    8.   
    9. function removeImage() { 
    10.     //image是body元素的子节点 
    11.     document.body.removeChild(document.getElementById('image')); 
    12.   
    13.     //这个时刻我们在全局的elements对象里仍然有一个对#button的引用。 
    14.     //换句话说,buttom元素仍然在内存中并且不克不及被收受接收。 

    经由过程SessionStack,你可以回放应用中的问题,看到问题对用户的影响。所有这些都不会对你的应用产生机能的影响。因为用户可以从新加载页面或者在应用中跳转,所有的不雅察者、拦截器、变量分派都必须合理处理。以免造成内存泄漏,也预防增长全部应用的内存占用。


      推荐阅读

      微软雅黑升级:Windows 10 RS4快速预览版17025更新内容大全

    沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!改良微软雅黑字体:正如大年夜中国Windows Insider会员收集的反馈,微软雅黑是用中文(简体)说话来显示Windows UI文本的字>>>详细阅读


    本文标题:如何处理JavaScript内存泄露

    地址:http://www.17bianji.com/lsqh/38229.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)