gpt4 book ai didi

c# - 什么可能导致此内存问题?

转载 作者:IT王子 更新时间:2023-10-28 23:38:22 25 4
gpt4 key购买 nike

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

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

在我因内存不足异常而崩溃后,我开始分析应用程序。我可以看到作为应用程序重要组成部分的 Web 浏览器正在正确处理。但我看到的问题是内存继续增加。更糟糕的是,我从探查器那里得到的反馈很少。据我了解,分析器图表说有一个大问题,而分析器数字说根本没有问题......

注意:该步骤表示从 WebBrowser 到另一个 WebBrowser 的导航。尖峰是由两个控件之间的动画创建的(我想)。在我在图像中选择的跨度中,我正在进行向前导航和向后导航,最多有 5 个 Web 浏览器(2 个用于始终存在的菜单,1 个用于索引页面,1 个用于我导航的页面和 1 个对于我导航到的页面)。每次导航时,分析器都会显示正确数量的 WebBrowser:向前导航后 5 个,向后导航后 4 个。

注2:我添加了红线以更清楚地表明内存在这段时间内正在上升

从图片中可以看出 profiler内存使用量很大,但数字表明它很低,并且在这段时间内,保留分配比开始时要低......

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

-WebBrowser 中的 javascript 做错了什么(例如,没有清理某些事件处理程序)。即使是这样,WebBrowser不应该在销毁时释放内存吗?

-使用唯一的 PhoneApplicationPage 是不应该做的坏事,改变它的结构可能会导致这种情况。

-其他?

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

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

最佳答案

好的,经过大量调查,我终于能够找到泄漏点。泄漏是由 WebBrowser 控件本身创建的,当您将其从面板中删除时,该控件似乎具有一些未删除的事件处理程序。事实上,通过以下步骤可以重现泄漏:

  1. 创建一个新的网络浏览器
  2. 将其添加到面板或其他任何内容中
  3. 导航到一个页面,其中的图片又大又重
  4. 点击浏览器空白处的某处(点击图片似乎不会造成泄漏)
  5. 删除并收集浏览器
  6. 从 1 开始重复

在每次迭代中,图像的内存都不会被收集,并且内存会继续增长。

已向 Microsoft 发送了一张票。

问题已使用 Web 浏览器池解决

关于c# - 什么可能导致此内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com