2010-11-10 47 views
5

在我目前的項目中,我注意到IE使用了相當多的內存。花了一些時間調查,我發現圖像不會從內存中刪除,但我的網站使用圖像相當強烈。IE8圖像緩存或錯誤?

最後我創建了一個簡單的測試,使用jQuery的

我的測試JS動態加載的圖像,然後將其清除:

$(document).ready(function() { 
    $('#appendImages').click(append); 
    $('#removeImages').click(remove); 
}); 

function append() { 
    $.post("http://localhost/TestService/GetImages", { key: $('#key').val()}, function (data) { 
     $.each(data.Data.items, function (i, v) { 
      $('#imagesContainer').append('<img src="' + v.imageUrl + '" />'); 
     }); ; 
    }); 
} 

function remove() { 
    $('#imagesContainer').empty(); 
} 

HTML測試:

<input id="key" type="text" value="jeans" > 
<div id="reset">Reset</div> 
<div id="repeatableReset">Repeatable Reset</div> 
<div id="stop">Stop</div> 
<br /> 
<br /> 
<br /> 
<br /> 
<div id="appendImages">append</div> 
<div id="removeImages">remove</div> 
<div id="imagesContainer"></div> 
<html> 

</html> 

雖然追加新圖像IE內存正在增加。但是當我刪除所有加載的圖像後,內存不會被清除。例如,在頁面加載後,IE進程使用20MB,添加圖像後使用35MB,清除後爲30MB。

我用sIEve工具找到任何leand,但它顯示沒有泄漏。 IE以某種方式緩存圖像嗎? IE中是否存在處理動態創建的圖像元素的問題?

更新 在Firefox的內存水平保持不變,但在IE它正在增加。

回答

1

這似乎是IE的問題。所有瀏覽器都會緩存內容,以便在需要時可以快速檢索內容。如果足夠聰明,IE會在一段時間後清除緩存,或至少關閉。

一種選擇是使用無緩存元標記,但這會減慢所有頁面的速度,因爲每次頁面都必須重新加載圖像。

至於實際使用情況,網站看起來相當大,但電腦現在至少有2GB內存(有些仍然滿意1GB),這已經夠用了。我不認爲你會遇到內存問題。

作爲一個方面說明,我有時候經過長時間的web-dev後,FireFox佔用了大量的內存。我認爲這只是瀏覽器很聰明。

我認爲瀏覽器應該更頻繁地清除它們的緩存 - 如果你訪問大量的網站,那麼它會很快變得非常大。

+0

最大內存上限是我們的網站350MB。請糾正我,如果我錯了,但這是相當多的。大多數網站沒有達到100MB的限制。 – lostaman 2010-11-10 23:45:29

+0

@lostaman - 是的,這是非常大的。我真的不確定你會如何解決內存問題,除非你使用no cache meta標籤來不緩存任何東西。你知道其他瀏覽器的內存使用情況嗎?這會很方便 - 如果是IE問題或代碼問題,這很明顯。 – Bojangles 2010-11-11 00:20:32

+0

發現有趣的事情。如果我打開Goog​​le網站並嘗試密集使用實例搜索(不刷新頁面),則IE中的內存級別正在增加。我設法達到了200MB的水平,只是輸入不同的組合。在Firefox中,一切都可以找到。如果ajax組件被大量使用,它可能只是IE以某種方式緩存內容。 – lostaman 2010-11-12 13:18:19

1

如果你做了很多使用jQuery那麼內存泄漏Ajax請求可以由此引起:

http://bugs.jquery.com/ticket/6242

有jQuery中的錯誤。有關詳細信息,請參閱上面的鏈接 - 修正計劃用於1.4.5版本,但您可以在註釋中找到一些代碼示例。

+0

我已經應用了此修復程序,但沒有改變這種情況。內存限制繼續增加。 – lostaman 2010-11-10 23:43:28

0

有可能IE沒有緩存圖像。

From jQuery docs

$.post('ajax/test.html', 
    function(data) { 
     $('.result').html(data); 
}); 

這個例子獲取請求 HTML片段,並將其插入的 頁面上。

網頁獲取與POST從來 緩存,所以緩存和jQuery.ajaxSetup(ifModified 選項)對這些請求沒有 效果。

您可以通過使用該解決方案以測量做一個測試:How to force a web browser NOT to cache images我們見證