问题描述
我有在UWP上运行的Xamarin.Forms应用程序,该应用程序的页面包含第三方组件。我已经导航到该页面并导航离开,处理了该页面及其中的所有组件。
我打电话给GC.Collect()
,希望页面及其控件不再在内存中。但是我发现该页面仍在内存中,并且在内存泄漏的底部是具有 Depenent Handle (或我假设的事件处理程序)的第三方组件:
向第三方报告此问题后,他们将做出以下回应:
我已经与开发团队讨论了这一点,并根据他们的意见,从视觉树中释放控件是由平台执行的,并且在删除树后不会立即执行,因此调用垃圾收集器并检查它是否仍在内存中并不意味着它正在泄漏。该平台可以在其他时间发布它。
现在,我认为上述说法并不正确...但是我无法在互联网或MS文档中找到任何证据来反驳它。
据我所知,如果我处理一个页面及其所有内容并调用垃圾回收器,则该页面及其所有控件应从内存中移走
这正确吗?
解决方法
所以我认为我的说法是正确的:
如果您在页面之间来回导航并处置该页面及其所有内容 组件,然后调用
GC.Collect()
。然后页面及其所有 组件应该从内存中删除。
我发现这篇文章确实做到了: https://www.xamarinhelp.com/tracking-memory-leaks-xamarin-profiler/
“”您希望在应用加载后按下快照按钮, 获得基线。然后,让我们导航到第二页,然后按 再次回来。我现在将创建另一个快照。那我可能会继续 再进行几次导航,然后再次按快照。”
“在我们的示例中,我们在MainPage和 第二页。我们之间最多只能看到一个新的SecondPage 快照,但是在这里我们看到创建了多个并且仍在 活跃。”