2011-09-25 62 views
1

由於在JavaScript腳本中使用'new Image()',導致內存泄漏。如果我看在Windows資源監視器中使用的物理內存,我得到當我加載的頁面使用的內存的預期增加,因爲它使用如下加載一些比較大的圖片:使用新圖像時在javascript中的內存泄漏()

var imgObjs = []; 

// in for loop i = 0, 1, 2... 
imgObjs[i] = new Image(); 
imgObjs[i].onload = function(event) { 
    // image loaded 
} 
imgObjs[this.img_src].src = this.img_src; 

我會雖然當頁面被導航離開這將自動銷燬引用並釋放內存,但這似乎並不是這種情況。相反,我導航離開,然後返回到頁面,只是找到內存斜坡,因爲它再次加載圖像,而沒有釋放先前分配的內存。我已經嘗試通過將代碼放入卸載事件來手動刪除引用來完成此操作,但它似乎沒有任何區別。這些變量最初都是用'var'聲明的:

// allow garbage collection by removing references 
$(window).unload(function() { 
    for(var i in imgObjs) { 
    imgObjs[i] = null; 
    delete imgObjs[i]; 
} 
delete imgObjs 

// delete other variables that reference the images 
}); 

沒有人有任何指向我在哪裏出錯的地方嗎?我想這個問題可能是循環引用做,因爲我已經建立了一個列表類,其中每個項目包含一個和下一個圖像的引用,但我已經deeted這些如下:

delete galleries[i].pictures.Items[j].prev; 
delete galleries[i].pictures.Items[j].next; 
+0

可能重複[Javascript + IMG tags =內存泄漏。有沒有更好的方法來做到這一點?](http:// stackoverflow。問題/ 336348/javascript-img-tags-memory-leak-is-there-a-better-way-to-do-this) – bzlm

+0

你在這裏提出了五個問題,從不接受一個作爲最佳答案。請解決這個問題,否則人們會開始忽略你的問題。 – jfriend00

+0

沒有意識到這是它的工作原理。我現在要做。 – Grub

回答

8

首先關閉,因爲你有圖像存儲在一個JS數組中,所以當你進入另一個頁面時,沒有我知道的泄漏的瀏覽器。

如果您在DOM < ==> JS之間有一些循環引用,則會出現一些較舊的瀏覽器,其中一些javascript引用DOM元素,而DOM元素上的自定義屬性引用回同一個javacript對象,但那樣做看起來不像你在這裏。

所以......如果你所看到的實際上是從一頁到另一頁的泄漏,我會感到驚訝。如果您確信這是事實,那麼請創建一個可以與我們分享的普通網頁,或者一個顯示問題的jsFiddle,並告訴我們您正在測試的確切瀏覽器的內容以及您如何測量內存使用情況確定你有泄漏。

因爲它確實是一個泄漏,你必須始終如一地看到內存使用量的增加和增加,每次你一次又一次地去頁面。僅僅因爲第二次進入頁面時總內存使用率稍高一點並不意味着你有泄漏。瀏覽器具有一些數據結構,這些數據結構隨着基於內存的緩存,會話瀏覽歷史記錄等的使用而增長(到某一點),這些數據結構不表示泄漏。

第二個關閉,我沒有看到您所顯示的數據結構中的任何內容,這些數據結構都是已知會導致舊版瀏覽器泄漏的循環引用的說明。

第三個 off,delete運算符用於從對象中移除屬性。就是這樣。請參閱以下文章:Understanding DeleteMDN Delete以獲得更多解釋。因此,卸載處理程序中的清理代碼沒有正確使用delete。您不能使用delete刪除變量或數組元素。雖然我看不到任何理由爲什麼這個代碼是必要的,如果你打算這樣做,它會是這樣的:

// allow garbage collection by removing references 
$(window).unload(function() { 
    for (var i = 0; i < imgObjs.length; i++) { 
     imgObjs[i] = null; 
    } 
    imgObjs = null; 
} 
+0

感謝您的反饋。我製作了一個自定義的'CircularListItem'類,用於表示我正在製作的圖像輪播。我沒有爲此發佈代碼,因爲我不知道它會是多麼相關,或者只是我誤解了一些更基本的東西。我想我會做的是通過你提供的文章,看看我是否能得到一個更健全的理解,並更新這個,如果我弄清楚發生了什麼。 – Grub

+0

由於發佈此發現,我發現它設置爲null,因爲你建議,而不是明顯的'刪除'濫用似乎保持讓瀏覽器釋放內存。在此之前,每當頁面刷新時,內存就會以明確的步驟增加,直到4GB內存中大部分內存已滿爲止!感謝您的建議。 – Grub

+0

謝謝!這個答案值得投票。 – GitaarLAB