【问题标题】:Dart: Memory management of DOM tree?Dart:DOM 树的内存管理?
【发布时间】:2013-12-30 17:47:01
【问题描述】:

我想知道我是否需要担心 - 甚至是敏感 - 我的 Dart 应用程序的内存管理。

假设我有一个包含 2 个“视图”/“屏幕”/“页面”的网络应用。视图 #1 有:

  • 50ButtonElements
  • 25 LabelElements
  • 40 InputElementss

视图 #2 有:

  • 30 ButtonElements
  • 35 LabelElements
  • 60 InputElementss

现在假设每个视图上都有按钮,允许用户在每个视图之间来回切换,一遍又一遍:视图 1 --> 视图 2 --> 视图 1 --> 视图 2,等等.

如果用户不断在视图之间来回切换,我担心不断地重新创建/重新实例化 DOM 元素,并最终占用内存资源。所以我问:

  • 这甚至是一个问题吗?如果不是,为什么
  • 如果这是一个问题,可以使用哪些编程技术来缓解它?
  • 当我从特定视图切换时,我可以做些什么来清理/销毁/释放未使用的内存?

【问题讨论】:

  • 您在使用聚合物吗?或者这是一个直接的 dart:html 应用程序?
  • 谢谢@Shailen Tuli (+1) - 这是一个直接的 Dart 应用程序,但既然你问我,我至少有兴趣听到如果它是聚合物,答案会有什么不同应用程序 :-)。再次感谢!

标签: dom memory-management dart


【解决方案1】:

内存管理应该始终是一个问题,因为您总是希望您的应用程序速度快,并且不占用不应该占用的资源。然而,垃圾收集是由浏览器自动对任何无法访问的对象(未在 DOM 中引用)执行的。这并不意味着您应该完全忽略此主题,因为仍然有可能造成泄漏。 Here's a nice tutorial 关于 javascript 中的内存泄漏。

在您的情况下,看起来最快的选择是将两个视图保存在一个 HTML 文件中,然后控制以编程方式显示的内容。这样,另一个视图在内存中等待并准备显示。一种简单的方法是更改​​要显示/隐藏的视图的显示样式。因此,您的视图可以包含在 div 中:

<div id="view1">
  //stuff in view #1 (visible)
</div>

<div id="view2" style="display:none">
  //stuff in view #2 (hidden initially)
</div>

当你想在视图之间触发时:

querySelector('#view1').style.display = 'none';
querySelector('#view2').style.display = 'block';

与单独加载每个页面相比,这种方法需要更大的内存占用。但是,它可以避免每次加载视图时都必须实例化每个元素,并且可以避免每次关闭视图时垃圾收集器都运行。

【讨论】:

    【解决方案2】:

    您是否考虑过对您的测试工具进行基准测试? https://www.dartlang.org/articles/benchmarking/ 似乎您可以扩展基准基类并编写自己的测试代码以针对生产 VM 进行基准测试。

    【讨论】:

    • 感谢@Syler (+1) - 我如何将基准与内存性能联系起来?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多