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

Ser*_*694 5 c# xaml windows-runtime windows-10 uwp

我正在尝试优化我的应用程序的内存使用情况,我注意到一个看起来很奇怪的行为,所以我想知道这是否正常.

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

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

内存使用快照

正如您在右侧的内存图表中所看到的,内存使用量正在增加,当我启动应用程序时,最大值大约为108MB,在屏幕中它达到了127MB.我的意思是没关系,应用运行正常,但我不确定这是否正常.堆大小似乎小于2MB,那么这些大约20MB的内存来自何处?

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

如果我继续导航我可以看到每个导航应用程序将花费大约1MB或更少,堆大小保持不变但私有内存总量不断增加,所以我不知道这里发生了什么.

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

在此输入图像描述

谢谢您的帮助!

Mic*_*ski 0

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

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

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

更新1

“诊断工具”窗口中,您有“内存使用情况”选项卡。那里有“拍摄快照”按钮。在导航之前和导航之后单击它。你应该看到类似这样的东西:

在此输入图像描述

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

  • 至于你的编辑,我已经尝试过使用快照功能,堆总是有大约 14-15k 项目(它们似乎是运行时对象,而不是我自己代码中的项目),大小约为 1-1.7MB,因此不可能吧..我的意思是堆看起来确实不错,我不知道增加的内存来自哪里 (4认同)