2011-08-18 50 views
1

我正在做一个实时聊天应用程序与Web界面,我得到了FF5(Linux二进制)不断增长的内存足迹。奇怪的是,铬没有表现出膨胀。我在做什么是以下几点:AJAX内存泄漏/膨胀

1)函数开球开始循环:

function init_chat() 
     { 
      doAjax ("my-url", handler_name); 
     } 

2)doAjax功能:

function doAjax(address, ajax_handler) 
     { 
      var xmlhttp; 

      if (window.XMLHttpRequest) 
      {// code for IE7+, Firefox, Chrome, Opera, Safari 
       xmlhttp=new XMLHttpRequest(); 
      } 
      else 
      {// code for IE6, IE5 
       xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
      } 

      xmlhttp.onreadystatechange = function() {ajax_handler(xmlhttp);}; 

      xmlhttp.open("GET", address, true); 
      xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
      xmlhttp.send(); 
     } 

3)在服务器上,请求线程最多等待3秒钟以获取新信息,并返回JSON响应

4)处理函数处理响应并再次调用doAjax,并将其本身作为处理函数。

据我了解,这是不正确的递归,作为Ajax调用应该产生一个新的线程,处理函数不应该在理论上持有跳指针回doAjax功能。也许我正在创建一个封闭,并没有被正确收集?如果是这样,我该如何避免它?

在此先感谢, 维克。

+0

更新:我更改了封闭专门摆脱xmlhttp对象后,它已被使用,以什么似乎是好的结果现在闭合看起来像这样:xmlhttp.onreadystatechange = \t \t \t \t函数() \t \t \t \t { \t \t \t \t \t如果(xmlhttp.readyState == 4 && xmlhttp.status == 200) \t \t \t \t \t { \t \t \t \t \t \t ajax_handler(XMLHTTP); \t \t \t \t \t \t xmlhttp = null; \t \t \t \t \t} \t \t \t \t}; – vivri

回答

1

我已经看到类似的事情与FF - 通常极端内存膨胀来自像萤火虫插件;不过,我总是建议手动取消JS中的对象来强制清除内存。内存管理与JS一般是穷人,这是最好的做法清理后自己..手动:(

+0

查看该问题的评论;手动将该闭包置零是有窍门的。 – vivri