【发布时间】:2012-03-24 17:27:33
【问题描述】:
我相当肯定我在使用 KO 版本 2.0 时会出现内存泄漏。我有一个可观察的数组,其中填充了 AJAX 调用的结果。此集合与每个 DIV 容器的数据绑定。数组中的每个对象都有一个绑定到复选框的可观察值。我已经使用 Chrome 检查了堆,我的结论如下:
如果 AJAX 调用返回 3 个元素,它们会在 DOM 上正确呈现。如果我此时对堆进行快照,其中有三个 SearchResult 对象。如果我再次触发 AJAX 调用并返回 5 个元素,则所有 5 个元素都会正确呈现到 DOM。但是,如果我在 Chrome 中对堆进行快照并进行比较,则会发现 8 个元素仍处于堆中,所有元素都被列为“添加”,没有一个元素被列为“已删除”。 DOM 显示总是正确的,但内存使用量却不断攀升,因为旧的搜索结果永远不会被释放。
谁能帮助我或给我一些诊断内存泄漏的指示?
更新
我创建了一个jsFiddle 来展示我正在做的事情的要点。除了核心功能之外,我已经剥离了所有内容,并且在本地计算机上运行时仍然可以复制内存泄漏。显然,代码在发布时无法正常工作,因为它需要访问我的本地服务器才能运行搜索。
更新 2
我提取了最新的 2.1.0.0 Beta 版本,泄漏消失了。我不是使用 beta 版本的东西或经典的“只是升级到新版本”修复的忠实粉丝。我仍然很想知道发生了什么变化或我做错了什么导致了泄漏。
【问题讨论】:
-
它真的会一直运行到内存不足吗? JS 引擎不会立即垃圾收集东西,所以你看到的可能只是引擎没有执行 GC,因为它仍然有足够的内存。
-
我看到我的网站使用了超过 450MB。在操作系统确定没有任何剩余可分配之前,引擎是否会继续使用越来越多的内存?这是否意味着操作系统会让浏览器继续使用越来越多的内存,直到计算机崩溃?我将如何测试它是否内存不足?
-
这种行为很难预测。您可以尝试让它一次又一次地循环 ajax 调用,看看它是否只是继续使用越来越多的内存。如果您尝试将代码简化为可以放入问题中的小测试用例,可能会有所帮助,如果结果证明是泄漏,可能也应该发送给 KO 开发人员。
-
在打电话获取新的之前,您是否要删除原件?
-
我正在按照 Knockout 人员的建议进行操作,并将数组值设置回一个新的空白数组
self.values([])