zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    Canvas文字的渲染--进阶
    RK 调试笔记.
    Java Basic
    Android Basics
    RK Android5.1 亮度条、ContentObserver内容观察者模式
    Android 检测外接USB设备、读取GPIO节点
    RK Android7.1 音频播放 Standby
    latch的产生
    git cherry-pick 将其它分支的提交应用到当前分支
    git stash '储藏'当前工作状态
  • 原文地址:https://www.cnblogs.com/TiestoRay/p/2652926.html
Copyright © 2011-2022 走看看