我目前正在開發一個網站,是純JavaScript並在很大程度上依賴於jQuery的&的jQuery UI庫(本網站不打算供普通大衆,因此,漸進增強是不是一個嚴格的要求爲這個項目)。我上執行下面的代碼遇到顯著內存泄漏:確定JavaScript的關閉與開發工具
oDialogBox = $("<div>...</div>");
/* Add useful things to the dialog box here */
oDialogBox.appendTo("body");
oDialogBox.dialog({
/* Other dialog box settings here */
close: function(event, ui) {
oDialogBox.dialog("destroy");
oDialogBox.remove();
oDialogBox = null;
}
});
在此對話框中的任何給定的時間,我創建,刪除和修改的大量jQuery的用戶界面按鈕,multiselects實例(每由Eric Hynds創建的Multiselect小部件)和單擊事件處理程序。根據jQuery UI文檔,在oDialogBox 應調用.remove()應該導致所有子窗口小部件被解除綁定和刪除。然而,我分離的DOM樹顯示了GC未收集的大量垃圾元素。
這很有可能是我錯過了一大組需要安全完成的關閉。如何做到以下幾點:
1)如何確定哪些閉包保持一個給定的分離DOM對象還活着(無論是在Firefox或Chrome)?
2)假設一套完整的倒閉是確定的,不任何超出歸零變量需要做的工作,以確保標記爲垃圾回收的DOM元素?
3)我也注意到,由頁面存儲的數組列表是巨大的,並且包含對GC未收集的DOM元素的引用。是否有記錄的最佳做法從JavaScript清理數組並允許將所有元素標記爲刪除? (注:這是內存泄漏的根源當前首要犯罪嫌疑人)
「*包含DOM元素引用的數組列表*」 - 可能是DOM元素未被垃圾收集的原因?你如何檢查這個列表? – Bergi
使用chrome開發人員工具時,我一直在使用分析器工具獲取堆快照。運行我的測試後,堆中佔用了近50MB的額外內存。這被分析器識別爲存儲在「(數組)」對象中。隨機檢查發現了Detached DOM樹中元素的jQuery屬性。我還發現了沒有被收集的空陣列的證據。我仍然試圖確定我的代碼中定義的任何數組是否隱藏在10k +對象的列表中。 –