【发布时间】:2013-02-14 02:25:11
【问题描述】:
情况:我正在开发一个相当复杂的单页 Backbone 应用程序,它可能会连续运行 8-12 多个小时。因此,需要确保应用程序不会泄漏,并且不会因 X 小时后崩溃或显着减速而闻名。
应用程序:应用程序基于Backbone (mv*)、Zepto(类似于 jquery)、Curl(amd 加载器)和Mustache(模板)构建。
问题:我刚刚征服了事件监听器。垃圾收集器似乎在清理这些家伙方面做得很好,但 DOM 节点数不会停止攀升。
问题:
- 是否有适当的方法来处理 DOM 节点,以便正确地对它们进行垃圾回收,或者这个 DOM 节点计数是一个永远不会减少的运行总数?
- 是否有人知道这些框架中的任何一个处理 DOM 节点不佳?可能是小胡子?
- DOM 节点数是一个可靠的数字吗?
我真的只是在寻找阻止这些 DOM 节点上升的冒险的开始。任何帮助或指导将不胜感激(并相应地赞成)。
我假设一旦事件侦听器被正确处理,DOM 节点计数就会自行管理,但情况似乎并非如此。
测试
- 第一次测试:6.8 分钟,110,000 个 DOM 节点
编辑:在没有时间线记录的情况下,我重新运行相同的脚本以随机混搭链接,并在大约 7 分钟时截取了屏幕截图。 GC通过后我得到了这些结果。
- 第二次测试:7.1 分钟,141,000 个 DOM 节点(没有时间线记录)
编辑:修复后:
Backbone 升级后,到处使用listenTo 和stopListening
- 7 分钟:6,926 个 DOM 节点(请参阅下面的标记答案)。
- 20 分钟:6,000 个 DOM 节点、20 个事件侦听器、20 MB 内存。
- 25 分钟:11,600 个 DOM 节点,44 个监听器,内存 21.7 MB。
- 28 分钟:9,000 个 DOM 节点,22 个事件监听器,内存 21.7 MB。
- 30 分钟:13,700 个 DOM 节点,123 个事件监听器,内存 21.7。
- 31 分钟:7,040 个 DOM 节点,30 个监听器,内存 21.7。
【问题讨论】:
标签: javascript backbone.js google-chrome-devtools mustache zepto