zoukankan      html  css  js  c++  java
  • 添加IFrame导致内存溢出的解决过程(IE浏览器,目前发现了原因,还未解决)

    1、  现象

    每次动态添加iframe时,iexplore.exe进程占据的内存都会增加(大概10M左右),不会自动释放,最终导致内存溢出

    2、  解决过程

    经过网络的一番搜索,基本上给出的解决方案是清空iframe内容,并移除iframe节点。方法如下:

      var el = document.getElementById("IFrame1");
    
                if (el) {
                    iframe = el.contentWindow;
                    
                    //清除文档
                    el.src = 'about:blank';
                    try {
                        iframe.document.write('');
                        iframe.document.clear();
    
                        CollectGarbage();
                    } catch (e) { };
    
                    //清除节点
                   var _parentElement = el.parentNode;
                    if (_parentElement) {
                        _parentElement.removeChild(el);
                
       }
                }



     

    此方法在重新加载iframe时都会释放一定的内存(可以从进程中看到内存的变化),但加载后新增的内存比释放的内存要多很多,再多次加载后还是会导致内存溢出


    还有的说是IE的bug,要用CollectGarbage()函数进行垃圾回收,但经过测试,此函数没有效果,内存溢出也不仅仅在IE存在,火狐和谷歌浏览器都有此现象,只是溢出程度较轻

        使用$.get替换iframe动态加载html,同样会导致内存溢出,看来不是iframe的原因

     $.get(src, function (data) { //初始將a.html include div#iframe
                        $("#center").empty();
                        $("#center").html(data);
                    });

    3、结论
      上述方法确实释放了一定的内存,但动态加载新的iframe后溢出了更多的内存,看来不仅仅是这方面的原因。后来经过调试代码,发现iframe页面引入了大量的js库,大概有几十种,如果删除一些内存溢出现象就会得到缓解,看来这就是原因。下一步准备对js库进行压缩和合并,看能否降低内存溢出。

  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/gossip/p/3689604.html
Copyright © 2011-2022 走看看