我目前遇到了我的第一个 GC 问题。使用应用程序一段时间后(例如 2 分钟或有时 20 分钟或更长时间),应用程序变得非常非常慢,并且 ram 和 cpu 使用率一下子显着增加。 此时GC时间明显增加,唯一的解决办法就是重新启动应用程序,经过很长时间的阅读一些文章。这还不是很清楚,为什么GC在帧内导航时可以在一秒内收集50次?堆大小没有被触发,很容易我不会手动调用 GC.Collect。
在出现问题之前,GC 处于活动状态(根据曲线),但一段时间后出现问题,但为什么?如何调查此事?
编辑 您好,我尝试在 VS 和 dotMemory 中使用探查器,也许我没有看到明显的问题,但我不明白这个示例。 当问题出现时,例如,如果我尝试在内存分析器内强制执行 GC,则 GC 需要很长时间才能完成工作(并且应用程序在前后很长一段时间内处于后台,没有任何交互) 内存泄漏是渐进的,在我的例子中,我只能在两个视图之间导航并加载、重新加载和重复。 片刻之后,一下子! GC 非常长,“简单”的内存泄漏可以解释 GC 的行为吗?
问题是由于在视图内创建 ViewModel 造成的。 我已经尝试了很多事情(将项目的 ItemSource 设置为 null、使用 Binding、删除绑定、仅使用空 VM 的空视图、更改缓存模式以及许多其他事情)
问题就在这里。 这是社区工具包中使用的一种为视图创建 VM 实例的方法:
public ListDetailsPage()
{
ViewModel = App.GetService<ListDetailsViewModel>();
InitializeComponent();
}
如果您像这样创建虚拟机:
public ListDetailsPage()
{
ViewModel = new ListDetailsViewModel();
InitializeComponent();
}
当选项卡从TabView中移除时,GC工作正常并且视图被释放。我无法解释为什么(对于 DI,VM 像往常一样声明)。 经过对 dotMemory 的大量测试,这是白天和黑夜,使用“new VM()”一切都像魅力一样工作,使用 VM 的 DI,每个加载的视图都不会被 GC 释放。
毫无疑问我疯了,但结果是显而易见的。