2011-04-07 32 views
1

我的web應用內存泄漏,所以我創建了一個測試網頁,看看我能找出實際上泄漏。所以我得到了這個簡單的代碼,可以非常快速地提高到大約300mb的內存使用量。簡單的jQuery AJAX泄漏(Windows7的)

在Chrome瀏覽器中相同的代碼似乎並不泄漏的內存使用情況,一旦GC已經運行顯著下降。在FF4(Windows 7)中,即使代碼運行完畢,內存使用似乎也不會下降。

這到底是怎麼造成內存泄漏或者是一個FF4的問題(我有noticed a few)?

注: 我使用jQuery 1.5和安全模式中禁用了所有插件正在運行。

$.ajaxSetup ({ 
     cache: false 
    }); 

    var counter = 0; 
    ajaxTest(); 

    function ajaxTest() 
    { 
     $.ajax({ 
      type: "GET", 
      url: "/web/data/data.xml", 
      dataType: "xml", 
      success: function(xml) { 
       $("#counter").text(++counter); 
       xml = null; 

       if (counter < 2000) 
        setTimeout(ajaxTest,25); 
      }}); 
    } 
+0

我還沒有找到解決方案,但我也已經注意到這個問題與Firefox 4.0.1與jQuery 1.5.1:jQuery的Ajax功能似乎泄漏只在FF4,FF3.6很好 – John 2011-05-06 15:09:22

回答

0

你可以在回調函數結束時調用沒有setTimeout的ajaxTest。爲什麼你需要setTimeout?

0

這可能是因爲緩存設置爲false。它並不能真正阻止你的瀏覽器緩存響應;它只是發送每個請求唯一的,所以它不會嘗試使用緩存的響應。也許Chrome可以更好地處理無用的緩存文件......我對瀏覽器緩存的工作方式知之甚少,但同一個xml文件的兩千份副本可能需要大量內存。

也許你可以啓用了,看看結果是不同的緩存嘗試。

編輯:其實,這是可能是錯誤的。你應該看看http://blog.linkibol.com/2010/05/07/did-you-know-that-jquery-leaks-memory-like-a-fountain/

我不明白爲什麼鉻會從不過問題免徵...

1

這[抗]模式:

function bar() 
    { 
     function foo() { setTimeout(bar,25); } 
     setTimeout(foo,1); 
    } 

被稱爲「俄羅斯Rulette」。在每次迭代中,創建新的遞歸閉包。從技術上講,這不是泄漏,而是內存中的手工遞歸結構。

+0

有趣的是,什麼是沒有遞歸關閉的方式來實現相同的結果? – Chris 2011-05-23 10:05:31

+0

@Chris:使用'setInterval'而不是使用遞歸調用。 – 2011-05-23 20:07:43

+0

如果使用setInterval如何確保ajax調用已完成100%? – Kuroro 2011-07-01 14:42:32