垃圾收集问题(WinUI && NET8.0)

问题描述 投票:0回答:1

我目前遇到了我的第一个 GC 问题。使用应用程序一段时间后(例如 2 分钟或有时 20 分钟或更长时间),应用程序变得非常非常慢,并且 ram 和 cpu 使用率一下子显着增加。 此时GC时间明显增加,唯一的解决办法就是重新启动应用程序,经过很长时间的阅读一些文章。这还不是很清楚,为什么GC在帧内导航时可以在一秒内收集50次?堆大小没有被触发,很容易我不会手动调用 GC.Collect。

在出现问题之前,GC 处于活动状态(根据曲线),但一段时间后出现问题,但为什么?如何调查此事?

诊断工具

问题期间框架内单个导航期间的事件

编辑 您好,我尝试在 VS 和 dotMemory 中使用探查器,也许我没有看到明显的问题,但我不明白这个示例。 当问题出现时,例如,如果我尝试在内存分析器内强制执行 GC,则 GC 需要很长时间才能完成工作(并且应用程序在前后很长一段时间内处于后台,没有任何交互) 内存泄漏是渐进的,在我的例子中,我只能在两个视图之间导航并加载、重新加载和重复。 片刻之后,一下子! GC 非常长,“简单”的内存泄漏可以解释 GC 的行为吗?

GC时间

c# garbage-collection .net-8.0 winui-3 winui
1个回答
0
投票

问题是由于在视图内创建 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 释放。

毫无疑问我疯了,但结果是显而易见的。

© www.soinside.com 2019 - 2024. All rights reserved.