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 上却没有