Memory leaks KnockoutJS内存泄漏

Memory leaks KnockoutJS内存泄漏,memory-leaks,knockout.js,Memory Leaks,Knockout.js,我相当肯定我使用KO版本2.0时内存泄漏。我有一个可观察的数组,其中填充了AJAX调用的结果。此集合是用for each绑定到DIV容器的数据。数组中的每个对象都有一个绑定到复选框的可观察值。我已经使用Chrome检查了堆,我的结论如下: 如果AJAX调用返回3个元素,它们将在DOM上正确呈现。如果我在此时拍摄堆的快照,其中有三个SearchResult对象。如果我再次触发AJAX调用并返回5个元素,则所有5个元素都正确地呈现到DOM中。但是,如果我在Chrome中拍摄堆的快照,并对它们进行比较

我相当肯定我使用KO版本2.0时内存泄漏。我有一个可观察的数组,其中填充了AJAX调用的结果。此集合是用for each绑定到DIV容器的数据。数组中的每个对象都有一个绑定到复选框的可观察值。我已经使用Chrome检查了堆,我的结论如下:

如果AJAX调用返回3个元素,它们将在DOM上正确呈现。如果我在此时拍摄堆的快照,其中有三个
SearchResult
对象。如果我再次触发AJAX调用并返回5个元素,则所有5个元素都正确地呈现到DOM中。但是,如果我在Chrome中拍摄堆的快照,并对它们进行比较,有8个元素仍然列在堆上,所有元素都列为“已添加”,没有一个列为“已删除”。DOM的显示总是正确的,但是内存的使用一直在增加,因为旧的搜索结果永远不会被释放

有人能帮我诊断内存泄漏吗

更新

我已经创建了一个示例来展示我正在做的事情的要点。除了核心功能外,我已将所有功能剥离,在本地计算机上运行时仍可以复制内存泄漏。显然,代码不会像发布时那样工作,因为它需要点击我的本地服务器才能运行搜索

更新2


我推出了最新的2.1.0.0测试版,漏洞消失了。我不太喜欢使用测试版的东西,也不喜欢经典的“升级到新版本”补丁。我仍然很想知道是什么改变了,或者是我做错了什么导致了泄漏。

你没有做错任何事,看起来像是
ko。cleanNode
忽略了
foreach
绑定,没有正确处理更新的
Observarray
中过时的对象


这在2.1.0beta版中已经修复

它是否真的会一直运行直到内存耗尽?JS引擎不会立即进行垃圾收集,因此您看到的可能只是引擎没有执行GC,因为它仍然有大量内存。我看到我的站点使用了超过450MB的内存。在操作系统决定没有剩余的内存可供分配之前,引擎是否会继续消耗越来越多的内存?这难道不意味着操作系统会让浏览器继续使用越来越多的内存,直到计算机崩溃吗?我如何测试它是否耗尽了内存?这种行为很难预测。您可以尝试让它一次又一次地循环ajax调用,看看它是否一直在使用越来越多的内存。如果您尝试将代码简化为一个小测试用例,您可以将其放入您的问题中,并且如果它被证明是泄漏,则可能也应该发送给KO devs。您是否在调用新的代码之前删除原始代码?我正在按照淘汰人员的建议执行,并将数组值设置回新的空白数组,
self.values([])
由于报告者使用了错误的敲除,因此关闭了。不能在同一个DOM节点上多次调用applyBindings()。