【问题标题】:KnockoutJS Memory LeakKnockoutJS 内存泄漏
【发布时间】: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([])

标签: memory-leaks knockout.js


【解决方案1】:

您没有做错任何事情,看起来ko.cleanNode 忽略了foreach 绑定,并且没有正确处理更新后的observableArray 中的过时对象。

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

此问题已在 2.1.0beta 中修复

【讨论】:

  • issue you refer to 已关闭,因为记者使用了错误的 Knockout。不应在同一个 DOM 节点上多次调用 applyBindings()。
猜你喜欢
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
  • 2013-06-24
相关资源
最近更新 更多