`
liweitsky
  • 浏览: 45090 次
  • 性别: 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.rar

    【标题】"仿WebQQ.rar"是一个项目压缩包,它旨在模仿WebQQ的桌面系统,让用户在桌面环境下体验类似于WebQQ的交互与功能。这个项目是用纯JQuery技术实现的,这意味着它主要依赖于JQuery库来处理DOM操作、事件绑定、...

    WebQQ_Demo WebQQ_Demo

    WebQQ_Demo是一个基于Web技术实现的QQ在线聊天示例应用。这个项目展示了如何利用Web技术来模拟原生QQ客户端的功能,让用户可以在浏览器上进行即时通讯。WebQQ_Demo的出现,是互联网技术和社交应用结合的一个典范,它...

    webQQ.rar_webqq

    6. **嵌入式功能**:将WebQQ程序嵌入到论坛中,意味着开发者可能使用了iframe或者其他嵌入技术,使得用户在论坛环境中可以直接启动WebQQ,提高了论坛的互动性和功能性。 7. **Web服务接口**:为了实现WebQQ的功能,...

    webQQ

    【标题】"WebQQ"揭示了我们讨论的主题是基于网页的QQ客户端实现,它允许用户在Web浏览器上体验类似于桌面版QQ的聊天功能。这种技术的实现基于Asp.net平台,利用C#编程语言编写了全部的源代码,旨在提供跨平台的即时...

    WebQQ桌面布局 WebQQ

    WebQQ桌面布局是一种基于网页技术实现的QQ客户端界面设计,它允许用户在浏览器上体验类似于桌面应用的QQ聊天功能。这种布局充分利用了Web技术的优势,如JavaScript库jQuery,来实现动态交互和响应式设计,为用户提供...

    WebQQ协议.rar

    8. **错误处理与重试机制**:在遇到网络故障或其他问题时,源码可能包含错误处理逻辑,以及在网络不稳定时自动重连或重试的机制。 9. **数据压缩与优化**:为了减少网络传输的数据量,协议可能采用了数据压缩技术,...

    WebQQ协议及客户端

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

    webQQ源码.e

    webQQ源码.e

    qt c++ webQQ 源码

    【Qt C++ WebQQ 源码解析】 在IT领域,Qt是一个强大的C++图形用户界面应用程序开发框架,它提供了一整套工具用于创建跨平台的桌面和移动应用。而WebQQ则是腾讯公司推出的一种基于网页的QQ客户端,它允许用户在...

    Mini WebQQ

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

    webqq网页形式全开放源码

    【标题】"WebQQ网页形式全开放源码"是一个针对WebQQ客户端的开源项目,它提供了实现网页形式QQ聊天的功能。这个项目对于开发者而言,是一个深入理解WebQQ工作原理、学习网页即时通讯技术的重要资源。 【描述】...

    WEBQQ登陆器.rar

    WEBQQ是腾讯公司推出的一种基于网页的QQ聊天服务,用户无需下载客户端,只需在网页上即可进行QQ聊天。这里的"登陆器"可能是指一个辅助工具或者网页应用的源代码,允许用户更方便地访问和使用WEBQQ服务。 【描述分析...

    webqq 源码 webqq仿制

    WebQQ源码与仿制是一项...开发者不仅需要具备扎实的技术基础,还要有良好的问题解决能力和创新思维,才能成功地打造出一款类似WebQQ的应用。在过程中,不断学习和研究新的技术和最佳实践,是提升自身技能的重要途径。

    webqq MIni版登陆程序

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

    jquery-WebQQ桌面布局

    【jQuery 插件 - WebQQ 桌面布局】是一种基于 jQuery 库的前端开发工具,用于构建类似于桌面应用的WebQQ布局效果。这个插件允许开发者为网页创建具有动态和交互性的用户界面,模拟了QQ桌面客户端的用户体验,使网页...

    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机器人

    WebQQ机器人是一种基于WebQQ接口实现的自动化工具,它能够帮助用户实现对QQ社交网络的自动化操作,如获取群聊、好友、讨论组及其成员的相关信息,并能自动接收文本消息。尽管目前它还不支持处理图片和文件这类多媒体...

    Asp.Net WebQQ源代码

    【Asp.Net WebQQ源代码】是一个基于ASP.NET技术实现的在线聊天工具,它旨在模仿腾讯QQ的功能,让用户能够在网页上实现类似QQ的即时通讯体验。这个项目的核心目标是利用Web技术来提供一种轻量级的、跨平台的聊天解决...

    WEBQQ完整协议文档

    根据给定的“WEBQQ完整协议文档”中的信息,我们可以提炼出以下关键知识点: ### WEBQQ 协议概述 WebQQ 是腾讯推出的一款基于网页端的即时通讯工具,它允许用户通过浏览器登录自己的QQ账号,并进行聊天、查看好友...

Global site tag (gtag.js) - Google Analytics