2012-05-15 60 views
6

我注意到,在我的應用程序中,與Win7上的IE進程相關的內存在每次刷新頁面時都會增加20-30 MB。一旦我達到約1.5 GB,瀏覽器變得無法響應。我使用IE9,並且只能在IE9中重現這一點。 Chrome,FF,IE7或IE8中不存在此類問題。事實上,在兼容模式下運行IE9時也不會發生此問題。IE9內存泄漏

我特別想知道的內存可以怎麼連後刷新頁面泄漏。有沒有人看過這個?

+1

這是一個非常難以解決的問題。我想這可能是由於很多原因,對不起:-( – Sebas

+1

沒有辦法爲大規模應用程序提供代碼片段,如果我可以提供片段,我已經有我的答案,因爲這需要我縮小問題的範圍正如我的問題所述,我正在尋找其他人遇到了和我一樣的情況:即使在頁面重新加載之後內存泄漏(僅限於IE9),以及一些解釋如何可以 –

+0

查看我的新回答Ray,今天才發現這個問題(與產品的最新版本有同樣的問題) –

回答

3

在過去,IE瀏覽器有一些問題與平常的JavaScript變量和DOM對象之間的引用。所以,如果我沒記錯的話,像這樣

var e = document.createElement('div'); 
var x = { elementReference: e }; 
e.jsReference = x; 

循環引用不會是垃圾回收,即使有對ex沒有其他的引用。這是因爲IE爲DOM元素和JavaScript使用了不同的垃圾收集方法。現在

,我相信這個問題在更高版本的IE已經被糾正,但也許事實並非如此。嘗試找到所有這些有問題的參考,並手動刪除它們,如果你不再需要它們。

e.jsReference = null; 
x.elementReference = null; 

編輯:測試在IE 8

我寫了這個簡單的測試網頁。

<html> 
    <head> 
    <title>Leak test</title> 
    <script> 
     function leak() { 
     var e = document.createElement('div'); 
     var x = { elementReference: e }; 
     e.jsReference = x; 
     } 

     function test() { 
     for (var i = 0; i < 10000; i++) 
      leak(); 
     alert('Done'); 
     } 
    </script> 
    </head> 
    <body> 
    <input type="button" value="test" onclick="test();" /> 
    </body> 
</html> 

我在IE 8中測試了這個,因爲我沒有在這臺機器上安裝IE 9。然而,這仍然可能是相關的,因爲它表明,這個問題仍然是,即使在相當最新版本的IE瀏覽器存在,因此它甚至可以在IE 9

我打開網頁,並觀看了內存使用情況仍然存在。每次按下按鈕後,內存使用量增加幾MB。刷新網頁後,絕對沒有任何事情發生。關閉IE後,內存使用量恢復到原始狀態。

您可以嘗試,對於自己在IE 9。當然,你可能不分配10000個在你的代碼circularily參考對象,但你可能創造可能包含你還沒有發現的一些循環引用較大的物體。

+0

這是否會解釋每個頁面重新加載時快速增長的內存?印象中,主機對象和本地對象之間的循環引用問題不能解釋每個頁面重新加載時增加的內存,而且,我也沒有明確地創建任何循環引用 –

+0

@ user48 6979編輯我的答案。 – Imp

6

我不知道這是否會是你的問題,但我也得到這個IE9的內存泄漏問題,即該存儲器上的不斷擴張(約每刷新/換頁20mgs)。

如果您正在使用Modernizr(現在應該在最近的一個版本中修復,我相信2.5+),但是如果您使用的是舊版本(並且不能只是因爲任何原因更新它),那麼你所需要做的就是替換一個return聲明。

問題與的Modernizr /地理位置& IE9發生的,它實際上是用IE9的繼承問題,沒有那麼多的Modernizr。

return 'geolocation' in navigator 

代替:

return !!navigator.geolocation // this causes the memory leak (silly IE9) 

https://github.com/Modernizr/Modernizr/issues/513

看看該鏈接,但基本上需要改變的地理位置測試return語句,而這個問題會解決本身!

+1

這是我的問題,你的建議救了我。當之無愧的upvote! –

+0

@danradu任何時候:)是的,這也讓我瘋狂了一小會兒......很高興幫助別人! –

+1

哇......這個問題的簡單解決方案一直困擾着我們。謝謝! –