【问题标题】:Does Xamarin Forms have memory leak on UWP?Xamarin Forms 在 UWP 上是否存在内存泄漏?
【发布时间】:2018-08-24 15:45:43
【问题描述】:

我编写了 UWP,但这也可以在 IOS 上的 Android 上,因为我只使用 VS2017 分析了 UWP 应用程序。

产生问题的步骤。 - 打开 VS 2017 并通过选择选项卡式页面或 masterdetail 页面来启动一个新的 xamarin 表单项目。无需编写任何单个代码。

问题;

  • 第一个快照是在应用程序加载之后。

  • 在选择列表中的一个项目并导航到 ItemDetailsPage 后拍摄了第二个

  • 第三张快照是在导航回 ItemsPage 后拍摄的

期望; 在第三张快照上看不到 ItemDetailsPage,因为我正在向后导航并且此页面已从导航堆栈中弹出。因此应将其移除、由 GC 收集或处置。

这是第三张快照的详细信息;

是我读错了这个快照还是 xamarin 表单应用程序有问题?

编辑:下面的屏幕截图还显示“检测到循环”。那是什么意思?我认为循环会导致内存泄漏,不是吗?

【问题讨论】:

    标签: xamarin.forms xamarin.ios xamarin.android xamarin.uwp


    【解决方案1】:

    在第三张快照上看不到 ItemDetailsPage,因为我正在向后导航并且此页面已从导航堆栈中弹出。因此应将其移除、由 GC 收集或处置。

    如果您尝试导航到不同的详细页面然后返回并再次拍摄快照,您会发现ItemDetailPage 的计数保持为 1。

    有时,出于性能考虑,页面或资源等对象将被正确缓存和重用。如果您有一个包含大图像或资源的页面,您应该尝试手动处理它们以减少内存使用。

    更新:

    现在的问题是如何正确处置它?在哪里做呢?我一直在阅读对我来说不安全的 OnDissapearing 方法,因为它可以在向前导航时调用,而不仅仅是在堆栈中导航回来。你对此有何建议?

    如果您不想为向前导航而释放资源,您可以在向前导航时定义一个状态参数,不要释放资源。例如:

    bool forwardNavigating=false;
    ...
     protected override void OnDisappearing()
     {
        base.OnDisappearing();
        if (!forwardNavigating)
        {
            //dispose your resources
        }
     }
    

    下面的屏幕截图还显示“检测到循环”。那是什么意思?我认为循环会导致内存泄漏,不是吗?

    cycle detected 表示:

    一个对象可以引用第二个对象,该对象直接或间接持有对第一个对象的引用。

    请参考Analyze .NET Framework memory issues的循环引用。

    个人想法:

    cycle detected 而言,我认为这不是内存问题。在某些情况下,当我们处于子对象中时,我们可能需要访问父对象。因此,我们需要一个属性Parent,而父级仍在引用子级。这在视图中经常发生。我不知道分析仪是如何工作的,是否是我上面描述的情况。我想说的是cycle detected 不等于内存泄漏。

    【讨论】:

    • 好的,这是一个公平的解释,以下是我的问题。我之所以进行这样的分析是因为我有一个大型应用程序,并且我的一个页面有一个带有图像的列表视图,而且我总是在缓存中看到这个页面,这让我觉得我的应用程序有问题。然后,我尝试了一个示例应用程序并看到了这个。现在的问题是如何正确处置它?在哪里做呢?我一直在阅读对我来说不安全的 OnDissapearing 方法,因为它可以在向前导航时调用,而不仅仅是在堆栈中导航回来。你对此有何建议?
    【解决方案2】:

    在 Xamarin ListView 中动态更改 BindingContext(通过设置 null 并重新分配新视图模型来重置 BindingContext)时会发生相同的内存泄漏。有没有人遇到过这个问题

    【讨论】:

    • 这很典型。 xamarin 对内存泄漏非常敏感。我建议你在你的发现、代码示例中发布一个新问题,但在像我一样进行分析之前。
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2011-01-29
    • 2011-05-08
    • 1970-01-01
    • 2011-06-26
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多