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

时间:2016-11-20 14:27:47

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

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

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

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

Memory usage snapshot

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

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

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

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

enter image description here

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在你所包含的图片中,我没有看到任何垃圾收集 - 它们用黄色指针表示。换句话说,即使存储器中存在未使用的对象,它们还没有被收集(释放),这就是存储器使用增加的原因。垃圾收集通常是一个缓慢的操作,不应该经常执行。在正常情况下,它仅在需要时运行。

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

如果您不想等待几分钟,您可以再进行一次练习,即通过调用GC.Collect()方法进行programaticaly强制GC。 但是,根据经验,从不在生产中使用 GC.Collect()如果您需要这样做,则表示您的代码存在问题。< / p>

更新1

诊断工具窗口中,您有内存使用标签。你有拍摄快照按钮。在导航前和导航后单击它。你应该看到类似的东西:

enter image description here

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