zoukankan      html  css  js  c++  java
  • L--js内存泄露

    简介

      内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。在C++中,因为是手动管理内存,内存泄露是经常出现的事情。而现在流行的 C#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露。浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器 垃圾回收方法有bug,会产生内存泄露,以下情况都是基于IE浏览器。

    1.给 DOM 对象添加的属性是一个对象的引用

    var MyObject = {};  
    
    document.getElementById('myDiv').myProp = MyObject;
    解决方法:在window.onunload 事件中写上: document.getElementById('myDiv').myProp= null;
     

    2.DOM 对象与 JS 对象相互引用

    function Encapsulator(element) {  
    
    this.elementReference = element;  
    
    element.myProp = this;  
    
    }  
    
    new Encapsulator(document.getElementById('myDiv'));
    解决方法:在window.onunload 事件中写上: document.getElementById('myDiv').myProp= null;
     

    3 .给 DOM 对象用 attachEvent 绑定事件

    function doClick() {}  
    
    element.attachEvent("onclick", doClick); 

    解决方法:element.detachEvent('onclick', doClick);

    4 .从外到内执行 appendChild 。这时即使调用 removeChild 也无法释放

    var parentDiv = document.createElement("div");  
    
    var childDiv = document.createElement("div");  
    
    document.body.appendChild(parentDiv);  
    
    parentDiv.appendChild(childDiv); 

     解决方法:从内到外执行appendChild

    5 .反复重写同一个属性会造成内存大量占用 ( 但关闭 IE 后内存会被释放 )

    for(i = 0; i < 5000; i++) {  
    
    hostElement.text = "asdfasdfasdf";  
    
    }
    //
    这种方式相当于定义了5000个属性!

     解决方法:就是编程的时候尽量避免出现这种情况

  • 相关阅读:
    推荐几个jQuery插件
    windows中安装node.js和测试
    使用javascript改变图片路径
    如何使用jQuery 制作全屏幕背景的嵌入视频
    SQL优化:一些简单的又实用的SQL优化方案【转】
    CentOS 6和 CentOS 7的区别【转】
    ssh密匙互信操作【原创】
    orchestrator的安装和配置
    部署gerrit环境完整记录【转】
    MySQL两地三中心方案初步设计【转】
  • 原文地址:https://www.cnblogs.com/guDouMaoNing/p/4389783.html
Copyright © 2011-2022 走看看