【问题标题】:Xamarin Forms app re-architechture due to memory leak(s)由于内存泄漏,Xamarin Forms 应用程序重新架构)
【发布时间】:2018-02-15 12:36:49
【问题描述】:

假设我有类似关注的东西

  1. 一堆数据类
  2. 大部分数据类的列表
  3. 加载 List>> 类以表示至少 3D 数组
  4. 由于线程访问,在不同页面中使用了一些 App.MyViewModel 视图模型
  5. 视图模型非常复杂,我喜欢大量的属性链接回第 3 点
  6. 最后,每个 ListView 模板都是从 List 之一生成的 ObservableCollection 创建的

在生命周期中,这些列表可能会被重新新建多次,我希望这应该回收以前使用的内存吗?列表视图行/单元格被创建为网格。 在多达数十行的小型列表视图中,它运行良好且快速,不会过多地增加内存使用。 但是,在包含数千行的大型数据集上,即使滚动 ListView 有时也会使应用程序崩溃,并且内存随着数据的每个部分而急剧增加。 所以问题真的是,根据您自己的经验,在故障排除和重新设计方法时您会推荐什么?

【问题讨论】:

  • 在 C# 中重新实例化列表或对象不会回收其内存。它在内存中创建一个全新的实例,并将旧数据留给垃圾收集器以释放内存。
  • 这对我来说很好。 :) 在分析应用程序时,我可以看到 GC 启动并执行某些操作,但显然还不够,因为内存使用量一直在增长。因此,我想以一种艰难的方式解决这个问题的方法之一是在某个阶段强制 GC 释放我在应用程序上的所有视图模型。但是在线阅读并不是一个好主意。
  • 您的实际行/单元格是什么样的,它们是否包含图像?根据我的经验,不正确的图像尺寸是内存问题中最常见的问题。
  • @MichaelRandall 我正在分析更多并放弃 GC 强制执行的想法,你是对的。

标签: c# listview memory architecture xamarin.forms


【解决方案1】:

你真的应该看看 Xamarin Profiler

Xamarin Profiler

Xamarin Profiler 有许多工具可用于 分析分配、周期和时间分析器

可能存在很多问题,以至于无法知道从哪里开始,至于设计,又一次很难知道如何重构您的应用程序,因为我们不知道您想要实现什么。如果您需要使用列表,则需要使用它们,并且您无能为力。

但是,您需要从第一原则开始,并确保您只做您需要做的事情,只实例化您需要实例化的内容,保持您的 xaml UI 尽可能减少循环计算。最后确保您的视图模型和对象超出范围并被垃圾回收

【讨论】:

  • 谢谢迈克尔,这是一个很好的建议,会看看它。我唯一的问题是“分析需要 Visual Studio Enterprise”。到目前为止,我已经使用了 VS Performance Profiler 和诊断工具,但无法弄清楚如何确定究竟是什么消耗了这么多内存。
  • 迈克尔,我认为你回答的最后一句话,指向了一些附带问题的根源。最初我们打算避免依赖注入并将所有相关信息直接存储在“根”视图模型中,以便轻松访问和随时可用,但事实证明您必须为“更方便的服务”支付更高的价格。 ...但我想,如果有合适的硬件,它仍然应该足够稳定。例如。如果是 UWP 应用程序,它在崩溃时几乎不使用 512 MB 的 RAM,只有 16 GB 可用。是 .Net 还是 Xamarin 我正在用错误的代码刹车? :) 修辞。
  • 是的,如果没有看到项目,就很难准确地说出气味和问题。但是,您确实需要遵循自己的想法。查明问题。知道 xamarin 表单可能很难计时,而且不像 wpf 或桌面应用程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2017-06-09
  • 2018-08-24
  • 2016-12-10
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多