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个属性!

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

  • 相关阅读:
    Git常用命令
    C++ 四种强制类型转换
    Linux系统日志及日志分析
    C/C++中的getline函数总结:
    标准C++中的string类的用法总结
    C++中map的基本操作和使用;
    一个C++类的注释:
    C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906
    c++ 的vector
    c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
  • 原文地址:https://www.cnblogs.com/guDouMaoNing/p/4389783.html
Copyright © 2011-2022 走看看