zoukankan      html  css  js  c++  java
  • 内存泄漏的多种情况

    本文总结自: http://www.jianshu.com/p/24874469dafd

    内存泄漏常见的是如下四种情况,在此只做记录,方便参考,详情可查看以上链接

    1.意外的全局变量

    常见情况如下:

    function a(){
        b= '111'
    }

    根据js语法可知,变量未声明就赋值将视为其作用域为全局作用域

    或者

    function a(){
        this.b= '111'
    }
    a()

    这也会创建一个全局变量

    解决方法:

    可使用"use strict",其禁止全局变量的隐形声明禁止this关键字指向全局作用域

    2.被遗忘的定时器或监听器

    var someResource = getData();
    setInterval(function() {
      var node = document.getElementById('Node');
      if(node) {
        node.innerHTML = JSON.stringify(someResource));
      }
    }, 1000);

    这样的代码很常见, 如果id为Node的元素从DOM中移除, 该定时器仍会存在, 同时, 因为回调函数中包含对someResource的引用, 定时器外面的someResource也不会被释放。

    同理: 

    var element = document.getElementById('button');
     
    var a= 1;
    function onClick(event) { element.innerHtml = 'text'; a= 100}
    element.addEventListener('click', onClick);

    也会找出内存泄漏

    解决方案:

    使用完毕后记得清除定时器及监听器

    3.没有清理的dom元素引用

    简单来说就是当元素已经从dom树中移除,但仍然有元素在引用它

    var elements = {
      button: document.getElementById('button'),
      image: document.getElementById('image'),
      text: document.getElementById('text')
    };
    function doStuff() {
      image.src = 'http://some.url/image';
      button.click();
      console.log(text.innerHTML);
    }
    function removeButton() {
      document.body.removeChild(document.getElementById('button'));
    
    }

    这会导致此dom元素不能被回收

    4.闭包

    var theThing = null;
    var replaceThing = function () {
      var someMessage = '123'
      theThing = {
        someMethod: function () {
          console.log(someMessage);
        }
      };
    };
    replaceThing()

    由于闭包的特性,内部能访问外部定义的变量,因此theThing无法回收

    解决方案:

    在replaceThing函数最后加上someMessage= null

  • 相关阅读:
    修复ecshop商品重量BUG小数位增至五位
    ECSHOP 支付宝发货确认接口,记录支付宝返回的交易号
    php数字补零的两种方法
    PHP获取当前时间的毫秒数(yyyyMMddHHmmssSSS)
    ajax 设置Access-Control-Allow-Origin实现跨域访问
    MySQL Master High Available 源码篇
    MHA 报错:There is no alive slave. We can't do failover
    cdid
    mha error
    mysql relay log参数汇总
  • 原文地址:https://www.cnblogs.com/yanze/p/7921957.html
Copyright © 2011-2022 走看看