(转载)随着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时,内存占用有一个明显减少。
分享到:
相关推荐
迷你WEBQQ
【标题】"仿WebQQ.rar"是一个项目压缩包,它旨在模仿WebQQ的桌面系统,让用户在桌面环境下体验类似于WebQQ的交互与功能。这个项目是用纯JQuery技术实现的,这意味着它主要依赖于JQuery库来处理DOM操作、事件绑定、...
WebQQ_Demo是一个基于Web技术实现的QQ在线聊天示例应用。这个项目展示了如何利用Web技术来模拟原生QQ客户端的功能,让用户可以在浏览器上进行即时通讯。WebQQ_Demo的出现,是互联网技术和社交应用结合的一个典范,它...
6. **嵌入式功能**:将WebQQ程序嵌入到论坛中,意味着开发者可能使用了iframe或者其他嵌入技术,使得用户在论坛环境中可以直接启动WebQQ,提高了论坛的互动性和功能性。 7. **Web服务接口**:为了实现WebQQ的功能,...
【标题】"WebQQ"揭示了我们讨论的主题是基于网页的QQ客户端实现,它允许用户在Web浏览器上体验类似于桌面版QQ的聊天功能。这种技术的实现基于Asp.net平台,利用C#编程语言编写了全部的源代码,旨在提供跨平台的即时...
WebQQ桌面布局是一种基于网页技术实现的QQ客户端界面设计,它允许用户在浏览器上体验类似于桌面应用的QQ聊天功能。这种布局充分利用了Web技术的优势,如JavaScript库jQuery,来实现动态交互和响应式设计,为用户提供...
8. **错误处理与重试机制**:在遇到网络故障或其他问题时,源码可能包含错误处理逻辑,以及在网络不稳定时自动重连或重试的机制。 9. **数据压缩与优化**:为了减少网络传输的数据量,协议可能采用了数据压缩技术,...
这是本人在WebQQ2.0协议的基础上,通过抓包分析WebQQ3.0协议做出的WebQQ客户端,开发工具Visual studio 2008,开发语言C#,此WebQQ客户端包括验证码获取,QQ登录,获取好友列表,获取在线好友列表,接收消息,发送...
webQQ源码.e
【Qt C++ WebQQ 源码解析】 在IT领域,Qt是一个强大的C++图形用户界面应用程序开发框架,它提供了一整套工具用于创建跨平台的桌面和移动应用。而WebQQ则是腾讯公司推出的一种基于网页的QQ客户端,它允许用户在...
Mini webQQ 1.0为我兴趣之作,只是一款辅助登陆webqq的小工具,感兴趣的朋友可以下载使用,它包含以下优点: 1、不含任何盗号木马。从本博客下载的软件,为第一作者上传的绿色软件,且你的QQ号不会被TX官方封杀。 ...
【标题】"WebQQ网页形式全开放源码"是一个针对WebQQ客户端的开源项目,它提供了实现网页形式QQ聊天的功能。这个项目对于开发者而言,是一个深入理解WebQQ工作原理、学习网页即时通讯技术的重要资源。 【描述】...
WEBQQ是腾讯公司推出的一种基于网页的QQ聊天服务,用户无需下载客户端,只需在网页上即可进行QQ聊天。这里的"登陆器"可能是指一个辅助工具或者网页应用的源代码,允许用户更方便地访问和使用WEBQQ服务。 【描述分析...
WebQQ源码与仿制是一项...开发者不仅需要具备扎实的技术基础,还要有良好的问题解决能力和创新思维,才能成功地打造出一款类似WebQQ的应用。在过程中,不断学习和研究新的技术和最佳实践,是提升自身技能的重要途径。
webqq MIni版登陆程序 webqq MIni版登陆程序webqq MIni版登陆程序webqq MIni版登陆程序
【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机器人是一种基于WebQQ接口实现的自动化工具,它能够帮助用户实现对QQ社交网络的自动化操作,如获取群聊、好友、讨论组及其成员的相关信息,并能自动接收文本消息。尽管目前它还不支持处理图片和文件这类多媒体...
【Asp.Net WebQQ源代码】是一个基于ASP.NET技术实现的在线聊天工具,它旨在模仿腾讯QQ的功能,让用户能够在网页上实现类似QQ的即时通讯体验。这个项目的核心目标是利用Web技术来提供一种轻量级的、跨平台的聊天解决...
根据给定的“WEBQQ完整协议文档”中的信息,我们可以提炼出以下关键知识点: ### WEBQQ 协议概述 WebQQ 是腾讯推出的一款基于网页端的即时通讯工具,它允许用户通过浏览器登录自己的QQ账号,并进行聊天、查看好友...