网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 IE8 内存泄露(内存一直增长 )的原因及解决办法
内容
    最近开发的时候对页面使用了定时的局部更新,结果在ie6,7和Firefox下,一切正常,而在ie8下过上几个小时就浏览器就崩溃了,显示是内存溢出,我以为是代码写的不好导致内存泄露,但是ie6,7又正常,调查了一下,原来这是ie8的bug。
    问题点
    在IE8中,生成特定Dom节点所占用的内存是不会被释放的,即使这些节点被删除内存也不会被释放。
    内存泄露的节点类型包括:form、button、input、select、textarea、a、img和objec
    其他的大部分节点类型是不会泄露的,例如:span、div、p、table等等。
    此问题只发生在IE8,其他浏览器不发生。
    如果用户按了F5,IE8会重新刷新页面,首先它会unload window.top,这时候会释放掉内存。如果页面是iframe,则unload此iframe,没有任何反应。看起来只有window.top被 unload,内存才会被释放。
    例子:
    例1
    执行下面的代码,IE8就会泄露内存。
    function leak1() { 
    var node = document.getElementById("TO_AREA"); 
    node.innerHTML = "<img />"; 
    node.innerHTML = ""; 
    node = null; 
    }
    注意:
    * 此例子添加了节点,所以会泄露。
    * 在中有个div,id为“TO_AREA”。
    * 提醒一下,这里没有闭包和循环引用。
    例2
    下面的代码没有使用innerHTML,但是还是会泄露
    function leak2() { 
    var node = document.getElementById("FROM_AREA").cloneNode(true); 
    node.id = "NEW_AREA"; 
    document.body.appendChild(node); 
    document.body.removeChild(node); 
    node = null; 
    }
    注意:
    * FROM_AREA 是form的id,而且这里也没有闭包和循环引用。
    例3
    这是最简单,最直接的例子:
    function leak4() { 
    var node = document.createElement("IMG"); 
    document.body.appendChild(node); 
    document.body.removeChild(node); 
    }
    注意:
    * 如果用span来代替img,就不会有泄露了。
    这些例子只在IE8中泄露内存,我在Windows XP, Windows Vista, Windows Server 2008, Windows Server 2008 R2和Windows 7 中的IE8都作了测试,而且使用了IE8中的IE7兼容模式和标准模式,每种情况下都会泄露。
    测试页面
    关于泄露
    内存大小随着时间的推移而增长,但这并不直接导致浏览器崩溃。浏览器使用的内存好像是有上限的,它似乎会从某些内部手段来限制DHTML使用的内存。
    内存到达上限后,浏览器会自动处理,例如弹出对话框,显示内存不足。
    经过自己测试发现 IFrame同样存在这个问题(在IE8下)
    补充:iframe内存释放
    Ext 核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,这部分工作必须在控件外来完成。另一方面, 相关资料称IE在iframe元素的回收方面存在着bug,在通常情况下应该将该元素的src属性值修改为”abort:blank”,并手工将其从 DOM树上移除,然后把脚本中引用它的变量置空并调用CollectGarbage()就可以避免iframe不能正常回收所造成的内存泄露。
    <script>
    function clearRAM() {
    var frame = document.getElementById("ifr_content");
    frame.src = 'about:blank';
    frame.contentWindow.document.write( '');//清空frame的内容
    frame.contentWindow.document.clear();
    frame.contentWindow.close(); //避免frame内存泄漏
    if (navigator.userAgent.indexOf('MSIE') >= 0) {
    if (CollectGarbage) {
    CollectGarbage(); //IE 特有 释放内存
    //删除原有标记
    var tags = document.getElementById("ifrSet");
    tags.removeChild(frame);
    //添加frameset框架
    var _frame = document.createElement('frame');
    _frame.src = '';
    _frame.name = 'content';
    _frame.id = 'ifr_content';
    tags.appendChild(_frame);
    }
    }
    }
    //主动释放 5秒一次
    setInterval( function() {
    if (navigator.userAgent.indexOf('MSIE') >= 0) {
    if (CollectGarbage) {
    //alert(1)
    CollectGarbage(); //IE 特有 释放内存
    }
    }
    }, 5000) 
    </ script>
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/22 9:06:34