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

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

  • 相关阅读:
    MSSQLSERVER数据库 变量和批处理
    MSSQLSERVER数据库 事务
    MSSQLSERVER数据库 使用C#来操作事务
    MSSQLSERVER数据库 视图
    Delphi中DBGrid行列颜色设置
    C#中调用SQL存储过程(带输入输出参数的例子)
    用Visual C#调用Windows API函数
    c#日期时间的操作的函数总结[转]
    C# 序列化与反序列化
    利用C#事务处理对数据库进行多重操作
  • 原文地址:https://www.cnblogs.com/guDouMaoNing/p/4389783.html
Copyright © 2011-2022 走看看