什么可能导致这个内存问题?

Fab*_*ini 7 c# memory xaml webbrowser-control windows-phone-8

我正在为Windows Phone 8开发应用程序,我遇到了内存泄漏问题.但首先是一些背景.该应用程序(不幸的是)使用WebBrowsers作为页面.这些页面非常复杂,涉及很多javascript.

应用程序的本机部分用c#编写,负责与javascript进行一些简单的通信(例如,native是javascript与服务器通信的委托),为页面转换,跟踪,持久性等制作动画.是在一个独特的PhoneApplicationPage中完成的.

在我因内存不足异常而崩溃之后,我开始分析应用程序.我可以看到WebBrowsers,它是应用程序的重要组成部分,正在正确处理.但我看到的问题是内存不断增加.更糟糕的是,我对分析器的反馈很少.根据我的理解,分析器图表说存在一个大问题,而分析器数据表明根本没有问题......

注意:该步骤表示从WebBrowser到另一个WebBrowser的导航.通过两个控件之间的动画创建(我猜)尖峰.在我在图像中选择的范围中,我正在向前导航,一个向后进行最多5个WebBrowsers(2个用于总是存在的菜单,1个用于索引页,1个用于我导航的页面和1个对于我导航到的页面).在每个导航中,探查器显示正确数量的WebBrowsers:向前导航后为5,向后导航后为4.

注2:我添加了红线,以便更清楚地知道内存在那段时间内会上升

从图像中可以看出 探查 内存使用量相当大,但数字表示它很低,在这段时间内,保留分配低于启动时...

我希望我已经包含了足够的信息.我想知道可能导致这个问题的一些想法.我到目前为止的想法是:

- WebBrowser中的javascript做错了(例如没有清理一些事件处理程序).即使是这种情况,WebBrowser也不应该在销毁时释放内存吗?

- 使用一个独特的PhoneApplicationPage是不应该做的邪恶,改变它的结构可能会导致这种情况.

-其他?

另一个问题:为什么图表显示正确的内存使用量而数字没有?

如果您需要有关探查器的更多信息,请询问,我将在明天发布.

Avi*_*ner 1

我认为没有足够的信息来找到泄漏的原因,并且在不发布整个解决方案的情况下,我不确定是否可以,因为问题是找到其根本原因......
我可以提供的是当我遇到内存泄漏时我使用的方法。

该技术是:

  1. 打开内存分析器。从您的屏幕截图中我看到您正在使用一个。我用了perfmon这篇文章有一些关于设置 perfmon 的材料,@fmunkert也很好地解释了它。
  2. 找到代码中您怀疑可能存在泄漏的区域。这部分主要取决于您对导致问题的代码部分有很好的猜测。
  3. 将泄漏推向极致:使用标签和“goto”来隔离区域/函数,并多次重复可疑代码(循环即可。我发现 goto 对于这件事更方便)。
  4. 在循环中,我使用了一个断点,每 50 次命中就停止一次,以检查内存使用情况的增量。当然,您可以更改该值以适应应用中明显的泄漏变化。
  5. 如果您找到了导致泄漏的区域,那么内存使用量应该会迅速飙升。如果内存使用量没有激增,请对您怀疑是根本原因的另一个代码区域重复阶段 1-4。如果是,请继续执行 6。
  6. 在您发现原因的区域中,使用相同的技术(转到+标签)放大并隔离该区域的较小部分,直到找到泄漏源。

请注意,此方法的缺点是:

  1. 如果您在循环中分配一个对象,则它的处置也应该包含在循环中。
  2. 如果有多个泄漏源,就会更难发现(但仍然有可能)