2012-03-24 64 views
13

我很確定我有使用KO版本2.0的內存泄漏。我有一個可觀察的數組,填充了AJAX調用的結果。這個集合與每個DIV容器的數據綁定在一起。數組中的每個對象都有一個綁定到複選框的單個可觀察值。我已經使用Chrome檢查了堆,我的結論如下:KnockoutJS內存泄漏

如果AJAX調用返回3個元素,則它們在DOM上正確呈現。如果我現在拍攝堆的快照,那裏有三個SearchResult對象。如果我再次觸發AJAX調用並返回5個元素,則所有5個元素都將正確呈現給DOM。但是,如果我在Chrome中對堆進行快照並對其進行比較,則列出的8個元素仍然在堆中,它們全部列爲「已添加」,沒有列出爲「已刪除」。 DOM顯示總是正確的,但內存使用只是不斷攀升和攀登,因爲舊的搜索結果永遠不會被釋放。

任何人都可以幫我或給我指針診斷內存泄漏?

UPDATE

我創建了一個jsFiddle,以顯示我在做什麼的要點。我已經將一切都分解了,但是核心功能和我仍然可以在我的本地機器上運行時複製內存泄漏。很明顯,代碼不會發布,因爲它需要打我的本地服務器來運行搜索。

更新2

我把最新的2.1.0.0 Beta版和泄漏消失。我不是使用測試版本的東西或經典的「僅升級到新版本」修復程序的粉絲。我仍然非常有興趣知道發生了什麼變化或者我做錯了什麼是造成泄漏。

+2

其實是否繼續下去,直到它運行的內存? JS引擎不會立即垃圾收集東西,所以你看到的可能只是引擎沒有做GC,因爲它仍然有足夠的內存。 – 2012-03-24 18:47:19

+0

我看過我的網站使用了450MB以上。在操作系統確定沒有任何剩餘分配之前,引擎是否會繼續佔用越來越多的內存?這不是說操作系統會讓瀏覽器在計算機崩潰之前繼續使用越來越多的內存嗎?我將如何測試以查看它是否耗盡內存? – arb 2012-03-24 20:28:15

+0

該行爲很難預測。您可以嘗試讓它一次又一次地循環播放ajax,並查看它是否繼續使用越來越多的內存。如果你試圖將代碼縮減爲一個小的測試用例,並且你可以把它放在你的問題中,並且如果它確實是一個泄漏,那麼可能會有所幫助,但也可能發送給KO開發人員。 – 2012-03-24 21:17:42

回答

10

你沒有做錯什麼,它看起來像ko.cleanNode忽略了foreach綁定,並沒有正確處理更新的observableArray內的過時的對象。

https://github.com/SteveSanderson/knockout/issues/271

這已被固定在2.1.0beta

+3

[你指的問題](https://github.com/SteveSanderson/淘汰賽/問題/ 271)被關閉,因爲記者使用了Knockout錯誤。不應該在相同的DOM節點上多次調用applyBindings()。 – GregT 2012-06-13 00:55:35