`
liweitsky
  • 浏览: 44532 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从webQQ谈iframe内存释放问题(转载)

    博客分类:
  • JS
阅读更多
(转载)随着Ajax的发展,使用javascript的RIA应用越来越多,用户在同一页面中驻留的时间越来越长,内存泄露和内存占用问题越来越值得RIA开发者的注意,当RIA应用中内存得不到合理的释放,内存使用量会持续上涨,造成RIA应用反应变慢甚至会造成用户浏览器崩溃。虽然这种问题很少显现,但并不是说明应用中不存在这种问题,只不过这些问题在用户页面跳转和关闭浏览器时被掩盖掉,当我们RIA应用要用户一直在同一页面中操作时,这些问题就会显现出来,webQQ(http://web2.qq.com/)正是这样一个典型的应用。在这些问题中比较显著的一个就是iframe的内存泄露问题,由于iframe的引用页会占用相对大量的内存,如果iframe得不到释放,内存会明显的增长。

在webQQ中,QQ空间、QQ邮箱、腾讯微博等都是通过iframe的方式引入的,而这些引用都是可关闭的,如何做到关闭时释放iframe和引用页所占用的内存?下面通过一个例子来看看,会出现什么问题和如何解决这些问题。

问题1:
Html代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
 <HEAD>  
  <TITLE>kjah.iteye.com</TITLE>  
    <SCRIPT LANGUAGE="JavaScript">  
    <!--  
        $=function(s){return document.getElementById(s)}  
        window.onload=function(){  
            var t=[];  
            var btn1=$('btn1'),btn2=$('btn2'),btn3=$('btn3');  
            btn1.onclick=function(){  
                if($('ifm1'))return;  
                var c=$('content');  
                var ifm=document.createElement('iframe');  
                ifm.src='http://www.sohu.com';  
                ifm.id='ifm1';  
                c.appendChild(ifm);  
                t.push(ifm);  
            }  
            btn2.onclick=function(){  
                var ifm=$('ifm1');  
                ifm.parentNode.removeChild(ifm);  
            }  
        }  
    //-->  
    </SCRIPT>  
 </HEAD>  
 <BODY>  
      <input id="btn1" type="button" value="打开"/>   
      <input id="btn2" type="button" value="关闭"/>  
      <div id="content"></div>  
      <span style="color:#eee">http://kjah.iteye.com</span>  
 </BODY>  
</HTML>  


数组t用来保持那些iframe的引用,模拟发生闭包引用dom对象,造成无法释放的情况。
用windows系统的任务管理器来观察内存使用情况,在打开iframe时内存会增长,而关闭时没有释放,由于之前的实例还被引用,再次打开时,内存会继续增长。以上是在IE下测试的结果,FF有很大好转。


问题2
Html代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
 <HEAD>  
  <TITLE>kjah.iteye.com</TITLE>  
    <SCRIPT LANGUAGE="JavaScript">  
    <!--  
        $=function(s){return document.getElementById(s)}  
        window.onload=function(){  
            //var t=[];  
            var btn1=$('btn1'),btn2=$('btn2'),btn3=$('btn3');  
            btn1.onclick=function(){  
                if($('ifm1'))return;  
                var c=$('content');  
                var ifm=document.createElement('iframe');  
                ifm.src='http://www.sohu.com';  
                ifm.id='ifm1';  
                c.appendChild(ifm);  
                //t.push(ifm);  
            }  
            btn2.onclick=function(){  
                var ifm=$('ifm1');  
                ifm.parentNode.removeChild(ifm);  
            }  
        }  
    //-->  
    </SCRIPT>  
 </HEAD>  
 <BODY>  
      <input id="btn1" type="button" value="打开"/>   
      <input id="btn2" type="button" value="关闭"/>  
      <div id="content"></div>  
      <span style="color:#eee">http://kjah.iteye.com</span>  
 </BODY>  
</HTML>  
 

在较复杂的javascript RIA应用中,由于开发人员技术水平等原因,造成这种不能释放DOM对象的情况很容易发生,查找这些引用非常困难。好在一般的DOM对象占用内存较少,即使不能释放(这里不包括内存泄露的对象)内存增长也不会很明显。在这个例子中,把数组t和相关的处理去掉,再来看内存的增长情况,发现多次打开iframe不会出现内存的持续增长,但在关闭时也没有得到大量释放,只是在再次打开iframe时,内存没有继续增长,感觉是把iframe给缓存住了。



解决办法
如何解决iframe的内存占用与内存增长的情况?不管是iframe引用无法释放的问题,还是iframe缓存的问题,通过把iframe对象的src置空,释放iframec所引用的页面内容是一个行之有效的办法,虽然iframe还是没有释放,但是它所占用的内存已大部分被释放掉。
Html代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
 <HEAD>  
  <TITLE>kjah.iteye.com</TITLE>  
    <SCRIPT LANGUAGE="JavaScript">  
    <!--  
        $=function(s){return document.getElementById(s)}  
        window.onload=function(){  
            var t=[];  
            var btn1=$('btn1'),btn2=$('btn2'),btn3=$('btn3');  
            btn1.onclick=function(){  
                if($('ifm1'))return;  
                var c=$('content');  
                var ifm=document.createElement('iframe');  
                ifm.src='http://www.sohu.com';  
                ifm.id='ifm1';  
                c.appendChild(ifm);  
                t.push(ifm);  
            }  
            btn2.onclick=function(){  
                var ifm=$('ifm1');  
                ifm.src="";  
                ifm.parentNode.removeChild(ifm);  
            }  
        }  
    //-->  
    </SCRIPT>  
 </HEAD>  
 <BODY>  
      <input id="btn1" type="button" value="打开"/>   
      <input id="btn2" type="button" value="关闭"/>  
      <div id="content"></div>  
      <span style="color:#eee">http://kjah.iteye.com</span>  
 </BODY>  
</HTML>  
 



通过观察,在移除iframe时,内存占用有一个明显减少。
分享到:
评论

相关推荐

    迷你QQ-WEBQQ

    迷你WEBQQ

    WebQQ协议及客户端

    这是本人在WebQQ2.0协议的基础上,通过抓包分析WebQQ3.0协议做出的WebQQ客户端,开发工具Visual studio 2008,开发语言C#,此WebQQ客户端包括验证码获取,QQ登录,获取好友列表,获取在线好友列表,接收消息,发送...

    仿WebQQ.rar

    仿WebQQ的桌面系统,纯JQuery制作,代码非常易理解 可马上上手进行二次开发

    WebQQ协议.rar

    WebQQ协议.rar

    webqq 源码 webqq仿制

    webqq 源码 webqq仿制 webqq 源码 webqq仿制

    webQQ源码.e

    webQQ源码.e

    WebQQ桌面布局 WebQQ

    jquery-----WebQQ桌面布局

    Mini WebQQ

    Mini webQQ 1.0为我兴趣之作,只是一款辅助登陆webqq的小工具,感兴趣的朋友可以下载使用,它包含以下优点: 1、不含任何盗号木马。从本博客下载的软件,为第一作者上传的绿色软件,且你的QQ号不会被TX官方封杀。 ...

    webqq MIni版登陆程序

    webqq MIni版登陆程序 webqq MIni版登陆程序webqq MIni版登陆程序webqq MIni版登陆程序

    WEBQQ 3.0 协议(完整加代码)

    WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议...

    webqq网页形式全开放源码

    webqq2009 开源 源码 webqq网页形式全开放源码

    WEBQQ完整协议文档

    WEBQQ完整协议,包含了所有的协议操作文档

    WEBQQ登陆器.rar

    WEBQQ登陆器.rar

    webQQ

    实现和QQ一样的效果,采用Asp.net设计,全部C#源码

    WebQQ_Demo WebQQ_Demo

    WebQQ_Demo! 值得下载看看!资源免费,大家分享!!

    JSP+Mysql 实现简易的 WebQQ

    JSP+Mysql 实现简易的 WebQQ

    PHP自动登录WEBQQ v1.0

    PHP自动登录WEBQQ是测试版本,真在进行长期登录测试不知道多久会自动断开,PHP自动登录WEBQQ有个优点,回复永远不会出现 此用户使用web.qq.com 登录。PHP自动登录WEBQQ注意事项没有添加防止重复运行 重复运行后果自负...

    仿webqq 源码,很炫的界面

    仿webqq 源码 ,很炫的界面

    WebQQ效果实现例子

    WebQQ 效果实现实例:超酷的webQQ桌面效果,桌面拖拽,桌面右键等。

    Api-Mojo-Webqq.zip

    Api-Mojo-Webqq.zip,【重要通知:WebQQ将在2019年1月1日停止服务,此项目目前已停止维护,感谢大家四年来的一路陪伴】使用Perl语言(不会没关系)编写的smartqq/webqq客户端框架(非GUI),可通过插件提供基于HTTP...

Global site tag (gtag.js) - Google Analytics