• IE内存泄露分析


    在IE中经常会有内存泄露出现。

    Javascirpt具有自动垃圾回收机制。离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。

    对原生JS对象的垃圾回收采用的是标记清除策略

    (这是目前主流的垃圾收集算法,基本思想是给当前不使用的值加上标记,然后再并回收内存空间)

    但在IE8及以下的版本中,对COM(控件对象模型)对象却采用的计数策略(跟踪记录所有值被引用的次数)

    ①当访问非原生JS对象(如DOM或BOM元素),并且代码中存在互相循环引用现象时,这种算法就会导致bug:即使清除该Dom元素,退出该上下文也不能释放内存。除非关闭页面。例如

    var obj = {};
    var doc = document.getElementById("DD");
    obj.ele = doc;
    doc.myObj = obj;

     解决方法:断开原生JS对象与DOM元素之间的连接,当垃圾收集器下次运行的时候就会删除这些没用的值,并回收内存。如下

    obj.ele = null;
    doc.myObj = null;

    及时解除不再使用的全局变量全局对象属性以及循环引用变量的引用。

    从外到内执行appendChild。这时即使调用removeChild也无法释放。例: 
    var parentDiv = document.createElement("div"); 
    var childDiv = document.createElement("div"); 
    document.body.appendChild(parentDiv); 
    parentDiv.appendChild(childDiv); 
    解决方法: 
    从内到外执行appendChild: 
    var parentDiv = document.createElement("div"); 
    var childDiv = document.createElement("div"); 
    parentDiv.appendChild(childDiv); 
    document.body.appendChild(parentDiv); 

     这里还有一篇介绍的很不错的文章:http://www.cnblogs.com/carekee/articles/1733847.html

     

  • 相关阅读:
    Linux命令大全
    paramiko 使用总结(SSH 操作远端机器)
    Django之ModelForm详解
    django模板之forloop
    学习VUE笔记及遇到的坑
    bootstrap table加载失败
    使用RedisTemplate遇到的坑
    grunt 不是内部或外部命令,也不是可运行的程序或批处理文件
    SpringBoot关于系统之间的远程互相调用
    数据在网络中的传输
  • 原文地址:https://www.cnblogs.com/TiestoRay/p/2652926.html
Copyright © 2020-2023  润新知