我制作了一个Windows手机应用程序,不幸的是有一些内存泄漏,因为页面没有正确删除。这是通过使用答案解决的:
Remove Pages windows phone 说明:
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的视觉效果和其他元素。所以这是一个重要的步骤。因此,我希望将功能分解到不同的项目中,以消除不同功能之间的任何联系并保持较低的内存使用率。最终得到以下结构:
我使用Portable Library在所有项目之间共享模型。 这影响了在每次导航到新项目时,在旧项目中清除了所有内容,即每个项目只有一个元素存在,主要的内存改进。但仍有一些内存泄漏,无论多么有限,意味着内存只有一定的增加。 但内存来自哪里?回到分析器:
这表明页面未被特定删除,所有元素 .view。都将被一个项目中所有页面配置中的代码删除。但是内存泄漏是类似的。
问题
两个项目之间没有共享信息,除了它们都可以创建LibraryOfModels
版本。因此,跨项目边界不共享任何事件,变量或引用。
但对于我的生活,我无法将它从记忆中删除。我想将它们从内存中删除,因为我的代码片段位于顶部,如果导航仅在一个项目中。问题的存在是因为导航分布在两个项目上。但它在其他领域有一些记忆优势,这就是我想要这种结构的原因。
希望有人可以提供帮助。 THX!
其他测试
我已尝试将所有页面用户控件设置为可以避免导航。但重建它们几次gav稳定泄漏1-2 Mb。因此,项目理念仍然是最好的,因为有一个限制。但仍然没有解决方案将其删除。
仍然希望骑士用闪亮的键盘;)
答案 0 :(得分:3)
我认为您可以将对象设为单例,并且可以相应地手动清除对象的值。 请参考以下链接 https://msdn.microsoft.com/en-us/library/ff650316.aspx
答案 1 :(得分:0)
查找所有一次性图形/ IO,确保将它们丢弃,(完成后使用它们) 所有此类对象都继承自IDispose接口。
答案 2 :(得分:0)
请注意第三方控件/库,Image,LongListSelector,FlipView或WebView,因为它们在内存管理方面存在一些问题。
您应该确保没有线程/任务/计时器继续引用您的Views / ViewModel。
有两篇关于内存泄漏的有趣文章:
我想在没有任何示例项目的情况下很难找到根本原因。如果它没有在具有相同体系结构的空项目中出现,那么代码中就存在一些问题。