2012-03-24 63 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