【问题标题】:Deleting project/pages/usercontrols from memory从内存中删除项目/页面/用户控件
【发布时间】:2015-05-08 23:21:37
【问题描述】:

我制作了一个 windows phone 应用程序,不幸的是,它有一些内存泄漏,因为页面没有被正确删除。这是通过使用答案解决的:

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 的视觉效果和其他元素。所以这是重要的一步。因此,我想将功能拆分到不同的项目中,以消除不同功能之间的任何联系并保持较低的内存使用率。最终得到以下结构:

  • 网络服务
  • 主项目
  • 次要项目
  • 便携式图书馆

我使用便携式库在所有项目之间共享模型。 这影响了每次导航到新项目时,旧项目中的所有内容都会被清除,即每个项目只存在一个元素,从而大大改善了内存。但是仍然有一些内存泄漏,但是有限的,这意味着内存只有一定的增加。 但记忆从何而来?回到分析器:

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

问题

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

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

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

其他测试

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

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

【问题讨论】:

  • 你确定没有附加事件吗?
  • 是的,这两个页面分为两个不同的项目,没有关系。由于它们不能引用相同的元素,因为它们在不同的项目中分离出来。我并不是说不同项目中不存在事件,因此删除整个项目会很有趣,因为它不会有任何运行时问题,因为这些引用永远不会被调用。您认为项目的内部引用会在没有任何引用指向项目的情况下使其保持活力?
  • 我认为在加载页面时可以尝试单例模式
  • @JestinC.I 我从未使用过它,但快速阅读一下让我有了以下理解。您可以使用Singleton 强制只创建一个对象实例,对吗?如果是这样,它对我没有帮助,因为每个实例只存在一个元素。我想将它们从内存中删除,就像我在顶部的代码 sn-p 可以做的那样,如果导航只在一个项目中。存在问题是因为导航分布在两个项目上。但它在其他领域有一些记忆优势,这就是我想要这个结构的原因。
  • 我还想到一件事:您是否使用了一些第 3 方控件/库、Image、LongListSelector、FlipView 或 WebView(因为它们在内存管理方面存在一些问题)?我想如果没有任何示例项目,将很难找到问题。您是否能够准备这样的东西,在哪里可以重现此问题?如果它没有发生在具有相同架构的空项目上,那么代码/控件中存在一些问题。

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


【解决方案1】:

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

【讨论】:

  • 如上述 cmets 所述,我看不出这应该如何解决问题。据我从您的链接中可以看出,它只会强制对象的一个​​元素。但是参考我的问题中的图像,您可以看到对象只有一个实例。那么这将如何帮助我从内存中删除现有页面呢?由于页面位于不同的项目中,因此在内存中只有一个的好处已经实现,并且我删除了 backstack,这会影响页面将在每次导航时重新制作(所需),但有些页面仍然存在,如何单身人士可以帮忙吗?
  • 单身无济于事。唯一的问题是内存中只有一个实例。你能解释一下,单身人士有什么帮助吗?
  • @jobyjames85: 单例一次只创建一个对象,所以对象处理会很容易,如果在某些情况下如果没有使用单例并且没有正确处理垃圾收集器,这种类型的内存会泄漏大型程序。
【解决方案2】:

找到所有一次性图形/IO,确保将它们处理掉,(在你用完之后)。
从 IDispose 接口继承的所有此类对象。

【讨论】:

    【解决方案3】:

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

    您应该确保没有线程/任务/计时器继续引用您的视图/视图模型。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      相关资源
      最近更新 更多