【问题标题】:Windows Mobile Memory Leak IssueWindows Mobile 内存泄漏问题
【发布时间】:2009-09-23 13:19:11
【问题描述】:

全部,

我目前有一个客户在运行我们的 Windows 移动应用程序时遇到了各种问题。这个问题是手机最终在运行应用程序时完全重置。我在内部进行了一些测试,但我没有经历过重置,但我注意到程序内存在运行表单时显着下降。我们一直在努力缩小应用程序的内存泄漏,但没有达到这么严重的程度。

最终应用程序会从程序内存中退出,但似乎并非所有内存都已释放。程序内存不会恢复到原来的样子。他们安装了一些第三方应用程序,例如 VicSoft ClearTemp,但这些应用程序似乎只是删除临时文件以保持较低的存储内存。有问题的手机是 Sprint 6800 Windows Mobile 6.0 专业版。该应用程序使用 .NET 2.0 Compact Framework 编写。

我们确实存在应用程序内存不足的问题,这仍然是一个持续存在的问题,而且这似乎是随机发生的。这个问题似乎与内存直接相关,但也许两者是携手合作导致崩溃的。

任何想法或帮助将不胜感激。

  • 史蒂夫

【问题讨论】:

    标签: windows-mobile compact-framework crash


    【解决方案1】:

    确保在处理完表单(调用 Dispose() 或在 using() 块中声明和使用它们)后处理它们,尤其是当它们包含位图和/或图片框时。更一般地说,确保您正在处置所有可以处置的资源。

    【讨论】:

    • 是的,任何与图形相关的对象(Graphics、Bitmap、Font、Pen、SolidBrush 等)都应显式处理,否则 .NET CF 将无法正确处理它们并因此泄漏内存。跨度>
    • ^^ 除了完整框架中的画笔集合。他们在退出时被整理,但他们不在 .NET CF 中,所以我想这个评论有点多余。 :)
    • @Quarrelsome:无论如何,位图都是大杀手,尤其是在 CF 中,因为在 Windows Mobile 中的某些情况下,它们是在专用视频 RAM 中而不是常规程序内存中创建的,并且在大多数设备中,此视频 RAM 被限制为大约 4 MB 甚至 1 MB。
    【解决方案2】:

    应用程序结束的影响可能是由以下两种情况之一引起的:

    1. 未处理的异常(可能是 OOM)导致它展开。你应该是handling these
    2. WinMo 平台本身是killing the app via the WM_HIBERNATE message

    正如已经指出的,确保您在所有与 GDI 相关的对象(位图、钢笔等)上调用 Dispose。可以在herehere 找到与位图相关的错误描述。

    要注意的另一件事是Components on a Form are not Disposed 当表单本身是(与控件不同)时。因此,如果您要进行大量表单创建和销毁,请密切注意这一点。

    如果您可以将项目升级到目标 3.5,即使它只是用于内部测试,运行CF 3.5 CLR Profiler 肯定可以帮助您找到漏洞。

    【讨论】:

    • 感谢 cmets!我已经审查了这里的所有帖子。我只想解释一件事。我们所有的表单都保存在内存中,就像以前每次实例化每个表单时一样,它正在消耗更多的内存。所有表单控件都保持原样。例如,如果我有一个带有一个用于搜索姓名的文本框的搜索屏幕,如果我输入“Steve”并离开表单,那么下次我设置表单时“Steve”仍会出现在该文本框中。就像我之前说的,我们一直保留这些。也许这是我们的问题?
    • @Steve:我认为将所有表单保留在内存中,而不是创建并处理它们是一个不同的问题,您在尝试解决方法时遇到了这个问题。更深层次的问题。在某些情况下,您可能需要挂起一个需要很长时间才能初始化的表单,但对于上面带有 TextBox 的简单表单,您绝对不需要这样做。
    • @Steve:我同意 MusiGenesis 的观点,即保留所有表格可能不是一个好策略(尽管我已经做过一些有意义的应用程序,所以这是一个个案)。您没有创建更多表单但内存不足的事实向我表明您确实在泄漏 - 可能是 GDI 对象。例如,您是否定期更改 PictureBox 中的图像或类似的东西?
    【解决方案3】:

    如果您不断创建和销毁对象,请确保您的事件处理程序未挂钩,否则垃圾收集器会认为这些对象仍在使用中,从而导致看起来像内存泄漏。

    【讨论】:

      【解决方案4】:

      Windows Mobile 内存泄漏的绝佳解决方案 - cleanRAM(RAM Cleaner)。

      获取更多信息并下载最新的 cleanRAM 版本:

      www.htcaddicts.com/?id=110

      【讨论】:

        【解决方案5】:

        如果它是内存泄漏,那么结果程序会获取越来越多的内存,直到最终由于内存不足而崩溃。这意味着动态创建或分配内存但忘记释放内存。如果发生内存泄漏,那么给定程序的内存将无法访问。对于这个特殊的解决方案,你也可以see this.

        【讨论】:

          猜你喜欢
          • 2010-12-15
          • 1970-01-01
          • 2016-07-28
          相关资源
          最近更新 更多