Xaml 应用程序加载阶段和内存泄漏检测

Xaml 应用程序加载阶段和内存泄漏检测,xaml,windows-phone-7,memory-leaks,Xaml,Windows Phone 7,Memory Leaks,我仍在与内存泄漏作斗争。使用改进的MemoryDiagnosticsHelper,我增加了创建数据统计以查看即时内存消耗的可能性 问题从完整的应用程序开始:我有一个包含3个项目的轴心,其中2个包含10-20个对象的列表(有可能跳转到项目细节)。内存诊断显示,它消耗了大约50Mb的内存。跳转到细节页面并返回pivot后,内存消耗很容易增加到70Mb 起初,我将列表移动到单独的应用程序。没有风格,它需要15兆。我还没有检查,但我假设,pivot中的两个列表大约需要20MB,因为DLL已经加载 所以,

我仍在与内存泄漏作斗争。使用改进的MemoryDiagnosticsHelper,我增加了创建数据统计以查看即时内存消耗的可能性

问题从完整的应用程序开始:我有一个包含3个项目的轴心,其中2个包含10-20个对象的列表(有可能跳转到项目细节)。内存诊断显示,它消耗了大约50Mb的内存。跳转到细节页面并返回pivot后,内存消耗很容易增加到70Mb

起初,我将列表移动到单独的应用程序。没有风格,它需要15兆。我还没有检查,但我假设,pivot中的两个列表大约需要20MB,因为DLL已经加载

所以,我决定深入到应用程序加载阶段

  • 在InitializePhoneApplication()上,它需要7 Mb
  • 在CompleteInitializePhone应用程序()中,空ViewModelLocator需要8.5 Mb,所有ViewModel需要10.5 Mb。相当大,但我有30-40个数据服务和40-50个视图模型。所以随它去吧,如果它不再生长,我会觉得自己很好
  • 在第一个页面的OnNavigatedTo()中,所有虚拟机占用的内存几乎相同,大约为10.7 Mb,这没关系
  • 没有利润。说真的,接下来会发生什么?我不知道接下来到底发生了什么,但MemoryDiagnosticsHelper说,内存消耗跳到了30Mbs。为什么?所有DLL和VM都已加载。我正在加载一个非常空白的页面,完全是白色的
探查器(当然是在发布模式下运行)也无能为力。它只是显示内存消耗的增长,但它发生在非托管内存中。这真的很让人恼火

好的,让我们把问题弄清楚。当应用程序初始化(通过初始化,加载并附加viewmodel,并在NavigatedTo()上传递页面)时,接下来会发生什么

编辑1:在晚上,我有了一个想法,我的应用程序中唯一薄弱的部分(至少是主控细节页面)是MVVMLight的EventToCommand。几乎谷歌的第一篇文章是谁都知道的,如果它真的被修复了?我查看了MvvmLight的博客,看起来Laurent现在正在进行安装。这促使我想到,这个漏洞应该已经解决了,不是吗

编辑2:我看到了泄漏问题的两种解决方案:要么使用上面链接中的修复,要么从codebehind调用命令。或者使用另一个MVVM库。

引用


在appinit的第一阶段,我希望它们加载得更平滑。另外,现在很清楚,为什么探查器说内存中没有那么多托管代码。

我不确定我是否理解问题所在。基本上,您是在抱怨从详细信息页面返回后内存没有下降,还是在抱怨使用的内存量?实际上,两者都是。首先,原因是:当我在母版细节页面之间跳跃时,内存量正在增长。没那么快,乍一看还可以(有点像大师(50)、细节(35)、大师(50)、细节(37)、大师(53)、细节(35)、大师(55)等等)。起初,我认为这是暂时的,但母版页上使用的内存量稳步增长。第二个结果是:当我试图查看内部时,在每个时刻使用的内存量上,我看到在整个应用程序加载后,内存消耗仍然有显著的跳跃,即使是空页面也是如此。@Vitalivasylenko上次我在windows phone上使用EventToCommand从MvvmLight(几个月前)发送命令时漏洞仍然存在,一个简单的修复方法是使用命名空间xmlns:i=“clr namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity”中的i:InvokeCommandAction,但它没有problem@BenoitCatherinet伟大的我本来打算将命令调用移动到codebehind,但您的修复速度要快得多。我同意如果您需要传递事件参数,在这种情况下,使用codebehind似乎是一个很好的解决方案,因为无论如何事件参数都与UI相关,因此可能不应该传递给视图模型,而是最好在codebehind中处理事件,并传递给视图模型一些更抽象的内容。