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

时间:2015-03-07 11:15:35

标签: c# visual-studio windows-phone-8 memory windows-phone

我制作了一个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();
        });
    });

}

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

enter image description here

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

  • 的WebService
  • MainProject
  • SecondaryProject
  • PortableLibrary

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

enter image description here

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

问题

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

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

    其他测试

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

查找所有一次性图形/ IO,确保将它们丢弃,(完成后使用它们) 所有此类对象都继承自IDispose接口。

答案 2 :(得分:0)

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

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

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

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