Be a programmer

Live with passion....
posts - 10, comments - 31, trackbacks - 2, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

IE memory leak problem

Posted on 2006-03-02 16:19 Programmer 阅读(1605) 评论(5)  编辑 收藏 网摘 所属分类: Ajax

Ajax 是现在 web 开发技术中的最炙手可热的技术之一。它为我们程序员提供了一种新的 web 应用程序开发模式,也给网页的访问者提供了一种全新的上网体验。我想也正是因为 ajax 的诸多优点,Microsoft 在发布了 asp.net 2.0 后又争对 ajax 启动了一个名为 Atlas 的项目。

然而,在 IE 浏览器(我使用的版本是 IE 6.0)中使用 ajax 的时候,不幸的是会出现“内存泄漏”的问题(在 Firefox 浏览器上没有这个问题)!在一个页面上,使用 ajax 调用服务器上的方法的次数很少的情况下,内存泄漏的问题是可以忽略的。然而对于某些需要频繁访问 web 服务器的应用程序来说,这是不可容忍的。我以前写过一个类似于 web messenger 的程序;在这个程序中,每 5 秒就需要访问服务器以获取新的消息。正常情况下,一般每个 IE 窗口需要的内存是 15M 左右。然而这个程序在运行的时候,它所消耗的内存在不断上升,大概 3 个小时左右就用掉了 200 多 M 的内存!而且在继续增长中...

要解决这个内存泄漏的问题,需要在执行完 ajax 方法后将创建的 XMLHttpRequest 设置成 null 值。使用改进后的 javascript 脚本调用服务器方法,对 IE 内存的使用不会有太大的影响。在我写的一个测试程序中,ajax 每 200 毫秒访问服务器(本机的)一次,从服务器获取一个动态生成的字符串,并在页面上显示出来。 IE 的内存占用一直保持在 10M 到 20M 左右。

改进后的主要的 javascript 脚本如下:

  • if( ! window.XMLHttpRequest ) {
  • window.XMLHttpRequest = function() {
  • var xmlHttp;
  • var progIDs=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
  • for (var i = 0; i < progIDs.length; i++) {
  • try {
  • xmlHttp = new ActiveXObject(progIDs[i]); // IE
  • return xmlHttp;
  • }catch(ex){}
  • }
  • if(typeof(XMLHttpRequest)!='undefined'){
  • try{
  • xmlHttp = new XMLHttpRequest(); // mozilla & firefox
  • return xmlHttp;
  • }catch(ex){}
  • }
  • return null;
  • }
  • }
  •  
  • function invokeAjax(url, data, callback){
  • var xml = new XMLHttpRequest();
  • var async = typeof( callback ) == "function";
  • if( async ) {
  • xml.onreadystatechange = doCallback;
  • }
  • xml.open( "POST", url, async );
  • xml.send( data );
  •  
  • if( ! async ) {
  • return createResponse();
  • }
  • return true;
  •  
  • function doCallback() {
  • if( xml.readyState != 4 ) {
  • return;
  • }
  •  
  • try{
  • if( xml.status == 200 ) {
  • // Invoke the javascript callback method
  • callback( xml.responseText );
  • }
  • }catch( ex ){}
  •  
  • // Release the XMLHttpRequest object here
  • xml = null;
  • }
  • }

Feedback

#1楼   回复  引用    

2006-03-02 16:28 by ee[未注册用户]
正常情况下对象使用完后是要(手工)释放掉的,应该不是ie的bug

#2楼   回复  引用  查看    

2006-03-02 16:48 by A.Z      
是啊close掉没有?

#3楼   回复  引用  查看    

2006-03-02 19:29 by 心碎了无痕      
我也遇到相同的情况,不过修改的地方和你的不同

#4楼   回复  引用  查看    

2006-03-02 19:32 by ocean      
我想是你建立了大量的xml对象没有释放吧,这个应该不属于内存泄漏的范畴吧。

#5楼   回复  引用  查看    

2006-03-02 20:42 by Nomagic      
在IE里,Javascript类(甚至是自定义类,也包括你说的Msxml2.XMLHTTP这些ActiveX)的实例,如果它的生命周期是横跨一组异步操作的,则在异步操作的最后时刻要把它设置为null,不然会造成内存泄露,同步操作时不必设置为null。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 341271




相关文章:

相关链接: