情况:我正在开发一个相当复杂的单页 Backbone 应用程序,它可能会连续运行 8-12 小时以上。因此,需要确保应用程序不会泄漏,并且会因 X 小时后崩溃或显着减速而享有盛誉。
应用程序:该应用程序基于Backbone (mv*)、Zepto(类似于 jquery)、Curl(amd 加载器)和Mustache(模板)构建。
问题:我刚刚征服了事件监听器。垃圾收集器似乎在清理这些家伙方面做得很好,但 DOM 节点数不会停止攀升。
问题:
- 是否有适当的方法来处理 DOM 节点,以便正确地对它们进行垃圾收集,或者这个 DOM 节点计数是一个永远不会减少的运行总数?
- 有谁知道这些框架中的任何一个不能很好地处理 DOM 节点?可能是胡子?
- DOM Node Count 是一个可靠的数字吗?
我真的只是在寻找阻止这些 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。