从内存中删除项目/页面/用户控件

我做了一个Windows手机应用程序,不幸的是有一些内存泄漏,因为页面没有正确删除。 通过使用答案解决了这个问题:

删除页面Windows手机说明:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { while (App.RootFrame.RemoveBackEntry() != null) ; //line if you navigate without backkey base.OnNavigatedTo(e); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); this.Dispatcher.BeginInvoke(() => { GC.Collect(); GC.WaitForPendingFinalizers(); }); }); 

}

这从分析器中删除了页面引用。 但是在导航时记忆仍然增加了一些。 并且增加记忆的来源并不明显。 因此,我尝试引入一个空白项目并导航到星空导航,如下所示:

在此处输入图像描述

这样可以移除超过20 mb的视觉效果和其他元素。 所以这是重要的一步。 因此,我希望将function分解到不同的项目中,以消除不同function之间的任何联系,并保持较低的内存使用率。 最终得到以下结构:

  • 网络服务
  • MainProject
  • SecondaryProject
  • PortableLibrary

我使用Portable Library在所有项目之间共享模型。 这影响了每次导航到新项目时,旧项目中的所有内容都被清除,即每个项目只有一个元素存在,主要内存改进。 但是仍有一些内存泄漏,无论多么有限,意味着只有一定的内存增加。 但内存来自哪里? 回到探查器:

在此处输入图像描述

这表明页面没有被特定删除,所有元素.view。 将被一个项目中所有页面的配置中的代码删除。 但是内存泄漏是类似的。

问题

  1. 如何在同一解决方案中删除其他项目中的页面和元素?
  2. 如何从内存中删除项目?

两个项目之间没有共享信息,除了它们都可以创建LibraryOfModels的版本。 因此,跨项目边界不共享任何事件,变量或引用。 但是对于我的生活,我无法将它从记忆中删除。 我想将它们从内存中删除,因为我的代码片段位于顶部,如果导航仅在一个项目中。 存在的问题是因为导航分布在两个项目上。 但它在其他领域有一些记忆优势,这就是我想要这种结构的原因。

希望有人可以提供帮助。 谢谢!

附加测试

我已经尝试使所有页面用户控制,以便我可以避免导航。 但重建它们几次gav稳定泄漏1-2 Mb。 因此,项目理念仍然是最好的,因为有一个限制。 但仍然没有解决方案将其删除。

仍然希望骑士用shiny的键盘;)

我认为您可以使对象单例,并且可以相应地手动清除对象的值。 请参考以下链接https://msdn.microsoft.com/en-us/library/ff650316.aspx

找到所有一次性图形/ IO,确保处理它们(完成后使用它们)。
所有这些对象都inheritance自IDispose接口。

注意第三方控件/库,Image,LongListSelector,FlipView或WebView,因为它们在内存管理方面存在一些问题。

您应该确保没有线程/任务/计时器继续引用您的Views / ViewModel。

有两篇关于内存泄漏的有趣文章:

  • WPF应用程序中的内存泄漏
  • 管理Windowsapp store应用中的内存

我想在没有任何示例项目的情况下很难找到根本原因。 如果在具有相同体系结构的空项目中没有出现,则代码中存在一些问题。