-->

Backbone.js的内存管理,瑞星DOM节点计数(Backbone.js Memory Mana

2019-07-20 16:26发布

现状 :我的工作有可能被运行8-12 +个小时了一个漂亮体面复杂的单页骨干的应用程序。 正因为如此,有必要确保应用不会泄漏,并有声誉X小时后崩溃或显着放缓。

应用 :应用程序是建立在骨干 (MV *) 的Zepto (类似于jQuery的), 卷曲 (AMD装载机) 胡须 (模板)。

问题 :我刚刚征服了事件侦听器。 垃圾收集器似乎是在做一个很好的工作,清理这些家伙了, 但DOM节点计数不会停止攀登。

问题

  • 有没有使他们正确地收集垃圾处置DOM节点的正确方法,或者是这个DOM节点计数的运行总计将不会减少?
  • 有谁知道任何这些框架来处理不良DOM节点的? 可能是胡子?
  • 是DOM节点计数甚至可靠的数字?

我真的只是寻找我冒险从上升停止这些DOM节点先拔头筹。 任何帮助或指导将不胜感激(并相应upvoted)。

我认为,一旦该事件侦听器进行妥善处置的DOM节点计数将只是自我管理,但这似乎并不如此。

测试


  • 第一个测试 :6.8分钟,110个DOM节点

编辑 :如果没有时间轴记录,我已重新运行相同的脚本随机醪链接,并采取了截图大约7分钟大关。 GC来了之后,通过我这些结果。

  • 第二个测试 7.1分钟后,141,000 DOM节点(如果没有时间表录音)

编辑:修复后

升级骨干网和使用listenTo和的stopListening后到处

  • 7分钟 :6,926 DOM节点(见下明显的答案)。
  • 20分 :6000个DOM节点,20个事件监听器,内存20 MB。
  • 25分钟 :11600个DOM节点,44个监听器,记忆21.7 MB。
  • 28分钟 ::9000个DOM节点,22个事件监听器,内存21.7 MB。
  • 30分钟 :13700个DOM节点,123个事件监听器,记忆21.7。
  • 31分钟 :7040个DOM节点,30个监听器,存储器21.7。

Answer 1:

我认为,一旦该事件侦听器进行妥善处置的DOM节点计数将只是自我管理,但这似乎并不如此。

如果我给你的权利,你正在尝试通过从消除听众处置的节点,是这样吗?

请注意,添加事件侦听器DOM节点不会妨碍从节点被垃圾收集,所述依赖性是在相反的方向上:当节点是活着侦听器函数将不会被收集。

  • 有没有使他们正确地收集垃圾处置DOM节点的正确方法,或者是这个DOM节点计数的运行总计将不会减少?

为了确保DOM节点可以被垃圾收集,你应该

  1. 从文档树的节点。
  2. 清除从JavaScript到节点, 在同一子树从JavaScript在子树的一个节点引用的所有节点的所有引用将持有整个子树。

因此,它是不够的,只是从一个节点删除监听器,使其收藏价值。 此外,它是没有必要的 ,如果你想收集的节点从一个节点删除监听器。

当一些节点通过GC收缴并销毁的DOM节点数量应该减少。 该数字表示已创建,但不被破坏,所以应该不会无限增长,除非有内存泄漏的DOM节点的电流量。

  • 是DOM节点计数甚至可靠的数字?

是。 这应该是一个可靠的数字作为每当创建一个新的DOM节点被递增,当它被摧毁递减。 因此,实现非常简单信任它。



Answer 2:

它是固定的! - 升级骨干网。 (继续阅读)

我们从骨干0.9.2升级到0.9.10骨干和落实在每一个视图/模型/收集listenTo和的stopListening。 结果是OMGFANTASTIC。

7分钟运行相同的压力测试后,这些结果如下:

结果 7.0分钟,6,926 DOM节点(如果没有时间表录像),事件监听器计数看起来像BLUE根草 。 我感到震惊。 内存使用量也令人惊讶的低相比于以前的测试。

经过18分钟 :事件监听器计数低于25000的整个时间是相同的,从来没有超过154和DOM节点计数停留! 显然有一些事情通过(即仍然在使用,最有可能的一些非骨干组件)下滑,但改善是惊人的。

结论 :在此之前版本的骨干,我们不是做了很好的工作骨干本身清理听众。 对DOM的听众都处理的很好,但不是模型/视图/集之间。 许多参与回调被拴我猜防止垃圾回收器释放的DOM节点骨干意见。 蔓生事件侦听器的地段/骨干网内回调(不只是绑定到DOM)创造了不少掉队不能被垃圾收集DOM节点。

如果这不是一个好足够的理由升级骨干,我不知道是什么;○



Answer 3:

上升的DOM节点计数为内存泄漏(通常在我们的页面的代码)的主要标志。 所以,你需要对争取的。 该标准的技术是在回答说明了这个问题。

快照内容有太多的细节。 而这3快照模式可以帮助你过滤掉快照不感兴趣的部分,仅显示了泄漏的候选人。

请确保您运行的是最新版本的Chrome,为例Chrome Canary版。 这应该是一个新的实例与单个标签不带扩展名。 这将是不错的控制台没有错误消息,没有断点,并且不出现异常停止,因为所有这些东西可能会影响页面,因此快照内容。

这篇文章可能对你有意思了。



Answer 4:

我发现了另一种方式,以避免JANK

render: function() {
  this.$el.empty();
  var container = document.createDocumentFragment();
  // render each subview, appending to our root element
  _.each(this._views, function(subview) {
     container.appendChild(subview.render().el)
  });
  this.$el.append(container);
}

此处是指它http://ozkatz.github.io/avoiding-common-backbonejs-pitfalls.html



文章来源: Backbone.js Memory Management, Rising DOM Node Count