2011-08-18 112 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