WP8大规模内存泄漏。

6
我在一个完整的应用程序中遇到了内存泄漏问题,使用的是C#和MVVM Light 5。我已经花费了整整一周的时间学习如何使用内存分析器,阅读关于常见内存泄漏问题的相关资料等等。我已经至少投入了25个小时来解决这个问题。我小心翼翼地清除了所有事件处理程序,甚至在后退导航后,以及检测到循环导航时,将每个页面的DataContext和LayoutRoot都设置为null。此外,当另一个页面实例即将创建时(我在App.cs中存储页面的最后一个运行实例),我会检查是否已经存在一个实例,如果是,则清除它。
我已经尽力而为,但我不知道该怎么办了。下面是在两个页面之间反复导航后的内存分析屏幕截图链接。每个页面的实例由于某种原因没有被释放,但它们确实被减少到了极小的字节级别。正如您所看到的,从开始到结束时保留的分配和可视化之间的差异非常小(总共约30MB)。然而,在图表中,我看到了近100MB的差异。这让我感到非常疯狂,我认为底层平台会做得更好来管理内存。非常感谢您的帮助。

你有没有使用WebBrowser实例?我不得不完全从我的应用程序中删除它,因为它给我带来了无法修复的内存泄漏问题。 - McGarnagle
Could be pictures too - Kevin Gosse
谢谢大家的回复。 我根本没有使用WebBrowser控件。 我有一些图片,但在仅5个导航周期内跳跃100mb有点太多了。最大的图片(全景背景)是400kb。其余的都在10kb以下。 - Matt F
KooKiz,我稍微读了一下你的博客,非常棒的信息,感谢分享。在其中,你说道: “……什么都没有。这意味着我们可能正在泄漏本地内存(分析器只显示托管内存,即.NET对象)。 ” 这正是我的情况,我对分析器更加熟悉,但远不及你。在你的博客文章中找出那个泄漏问题真是太厉害了,希望我也能用这种方法解决这个问题 >_< - Matt F
@MattF 如果您愿意分享您的代码,请通过 Twitter(@kookiz)或我的博客与我联系,我会尽量在这个周末抽出时间给您提供帮助。 - Kevin Gosse
1个回答

0
我仔细清除了所有的事件处理程序,甚至在后退导航后将每个页面的DataContext和LayoutRoot设置为null。
我建议建立一个系统来重复使用VMs,并且只在确实需要时获取新数据。我曾经参与开发过一款专业的地图应用程序,目前已经在WP商店上架,我们只在需要时创建项目,从未创建过两次VM。

正确,我正在使用MVVM Light附带的Simple IOC来处理我的ViewModel实例。我的ViewModels永远不会被创建两次。因此,这不能是我的问题的根源。谢谢! - Matt F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接