Xamarin Forms 在 UWP 上是不是存在内存泄漏?

Posted

技术标签:

【中文标题】Xamarin Forms 在 UWP 上是不是存在内存泄漏?【英文标题】: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 表单应用程序有问题?

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

【问题讨论】:

【参考方案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 对内存泄漏非常敏感。我建议你在你的发现、代码示例中发布一个新问题,但在像我一样进行分析之前。

以上是关于Xamarin Forms 在 UWP 上是不是存在内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UWP 上使用 Xamarin.Forms 在平板电脑之间通过 WiFiDirect 发送视频

hockeyapp 在 xamarin.forms 应用程序中的 UWP 上引发异常

HttpClient.SendAsync 在 Xamarin.Forms Android 上引发 ObjectDisposedException,但在 UWP 上却没有

Xamarin Forms - 防止键盘在 UWP、Android、iOS 中的条目焦点上显示

使用 Xamarin Forms 缩放 UWP 图像

Xamarin.Forms 热重载在 UWP 中不起作用