c# - 导航期间内存增加,但堆看起来不错?

标签 c# xaml windows-runtime uwp windows-10

我目前正在尝试优化我的应用程序的内存使用,我注意到一个对我来说很奇怪的行为,所以我想知道这是否正常。

我在同一页面的不同实例之间执行一系列导航,我检查过,垃圾收集器似乎工作正常,因为在每次导航之后,页面实例以及 ViewModel 实例和每个 ViewModel 中的模型实例。

但是,在每次导航之后,我都看到内存使用量不断增加(在调试和 Release模式下均进行了测试)。这是一个快照:

Memory usage snapshot

在右侧的内存图表中可以看到,内存使用量在增加,当我启动应用程序时最大值在108MB左右,在屏幕上达到了127MB 。我的意思是没关系,应用程序运行正常,但我不确定这是否正常。 堆大小似乎小于2MB,那么这些~20MB 的已用内存从何而来?

堆中最大的对象似乎都是系统对象(除了包含当前用户的头像图像的 UserHamburgerButtonViewModel,这就是它的大小的原因),但无论如何,堆中对象的总大小堆比那些 20MB 的内存要低得多。

如果我继续导航,我可以看到该应用每次导航将占用或多或少 1MB,堆大小保持不变,但私有(private)内存总量不断增加,所以我不知道这里发生了什么。

编辑:这是对@Michał Komorowski 的回应,这是另一个 GC 调用的屏幕截图,问题仍然存在:

enter image description here

感谢您的帮助!

最佳答案

在您提供的图片中,我没有看到任何垃圾收集 - 它们由黄色指针指示。换句话说,即使内存中有未使用的对象,它们还没有被收集(释放),这就是内存使用量增加的原因。垃圾收集通常是一项缓慢的操作,不应过于频繁地执行。在正常情况下,它仅在需要时运行。

尝试运行您的应用程序更长的时间,例如几分钟。在某些时候,您应该观察到垃圾收集,内存的使用会减少。

如果您不想等待几分钟,您可以再做一个练习,即通过调用 GC.Collect() 以编程方式强制 GC方法。 但是,根据经验,切勿在生产中使用 GC.Collect()如果您需要这样做,则意味着您的代码有问题。

更新 1

Diagnostic Tools 窗口中,您有 Memory Usage 选项卡。那里有拍摄快照 按钮。在导航之前和导航之后单击它。你应该看到类似的东西:

enter image description here

在此示例中,您可以看到同时创建了 4000 个额外的对象。如果单击链接,您将看到一个新窗口,显示实际创建的对象类型。

关于c# - 导航期间内存增加,但堆看起来不错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40705205/

相关文章:

c# - 如何解释错误 'Client found response content type of ' text/html'..

c# - 如果存在验证错误,也要更新 ViewModel 中的属性

windows - 如何在 WinRT 中打印字形元素

c++ - 从 native C++ 类的实例到 C++/CX ref 类的回调的最佳方法是什么?

javascript - 动态内容注入(inject)的 Webview 限制

c# - 使用 Unity 容器解析 NLog 实例

c# - 将 IEnumerable<T> 转换为用户类型的更好方法

c# - 列出有向图中的所有负循环

xaml - 使用 Visual State Manager 优于在代码中处理 Current_SizeChanged 事件的优势(WinRT、XAML)

wpf - 如何根据属性值禁用数据绑定(bind)的 ListBox 项?