草庐IT

javascript - Backbone.js 内存管理,增加 DOM 节点数

coder 2024-05-07 原文

情况:我正在开发一个相当复杂的单页 Backbone 应用程序,它可能会连续运行 8-12 小时以上。因此,需要确保应用程序不会泄漏,也不会因 X 小时后崩溃或速度急剧下降而出名。

应用:该应用基于 Backbone 构建(mv*), Zepto (类似于 jquery),Curl (amd 装载机) & Mustache (模板化)。

问题:我刚刚征服了事件监听器。垃圾收集器似乎在清理这些家伙方面做得很好,但 DOM 节点数不会停止攀升。

问题:

  • 是否有适当的方法来处理 DOM 节点,以便它们被正确地垃圾收集,或者这个 DOM 节点计数是一个永远不会减少的运行总数?
  • 有没有人知道这些框架中的任何一个不能很好地处理 DOM 节点?可能是 mustache ?
  • 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。

最佳答案

I assumed that once the event listeners were properly disposed of that the DOM Node Count would just manage itself, but this doesn't seem to be the case.

如果我没听错,您是在尝试通过移除节点中的监听器来处理该节点,是这样吗?

请注意,将事件监听器添加到 DOM 节点并不会阻止该节点被垃圾收集,相关性是相反的:当节点处于事件状态时,将不会收集监听器函数。

  • Is there a proper way to dispose of DOM Nodes so that they will be properly garbage collected, or is this DOM Node Count a running total that will never decrease?

要确保 DOM 节点可以被垃圾回收,您应该

  1. 从文档树中删除节点。
  2. 清除从 javascript 到节点的所有引用 AND 到同一子树中的所有节点,因为从 javascript 到子树中的一个节点的引用将包含整个子树。

因此,仅从节点中移除监听器以使其可收集是不够的。此外,如果您希望收集节点,则没有必要从节点中删除监听器。

当某些节点被 GC 收集并销毁时,DOM 节点数应该减少。该数字表示当前已创建但未销毁的 DOM 节点数量,因此它不应无限增长,除非存在内存泄漏。

  • Is the DOM Node Count even a reliable figure?

是的。它应该是一个可靠的数字,因为每当创建一个新的 DOM 节点时它都会递增,而在它被销毁时递减。因此,实现起来非常简单,值得信赖。

关于javascript - Backbone.js 内存管理,增加 DOM 节点数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126334/

有关javascript - Backbone.js 内存管理,增加 DOM 节点数的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  3. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  4. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  5. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  6. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  7. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  8. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  9. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  10. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

随机推荐