【问题标题】:.NET CF Application and Out of Memory Exception.NET CF 应用程序和内存不足异常
【发布时间】:2008-11-11 08:41:35
【问题描述】:

我正在开发一个 .NET CF 3.5 网络游戏。我的问题是应用程序首先加载所有资源。然而,在后续启动时,该应用程序在加载资源(尤其是声音或大图像)时异常给我内存。

请指导我

【问题讨论】:

    标签: c# .net memory-management


    【解决方案1】:

    我假设您不会尝试一次启动多个游戏实例。这听起来像是游戏关闭后内存没有返回到操作系统。确定是否有泄漏的一种简单方法是:

    1. 重启设备
    2. 检查内存使用情况
    3. 开始你的游戏,玩几分钟
    4. 关闭游戏
    5. 等待几分钟,然后再次检查内存使用情况

    如果您可以在内存不足之前启动几次,那么您就有了小泄漏。如果您只能在重新启动设备之前启动一次,那么您就有了一个大的。垃圾收集只会到此为止。如果您正在对非托管代码进行任何调用(Win32 或 PInvoke 调用实例化非托管对象),那么您需要确保在游戏关闭时释放这些资源。

    【讨论】:

    • 戴夫,谢谢,应用程序没有正常关闭(任务管理器也没有显示它)。有一个正在执行的连接线程!所以我猜它让应用程序进入后台,所以它没有正确退出。中止线程后,问题没有出现!
    【解决方案2】:

    加载所有资源后,您的应用程序占用了多少内存?在默认设置下,我在 cca 1.3 GB 私有字节时收到此错误(检查任务管理器和进程内存分配)。

    【讨论】:

    • 1.3 GB?你确定它在 .NET CF 上吗
    【解决方案3】:

    Microsoft 为我们提供了 CLR Profiler,这是一种用于分析托管应用程序行为的工具,您可以下载 here。它是 .NET 2.0 的 CLR Profiler,但它可以与 .NET 3.5 一起使用,因为 CLR 尚未更改。

    【讨论】:

      【解决方案4】:

      问题的一部分可能是 .NET CF 不能很好地处理 Windows CE 的内存模型。 (即使有那么多可用内存,大内存分配也会失败并出现 OutOfMemory 异常;我不知道事情开始中断的神奇数字......)

      以下是一些细节: .Net Compact Framework Advanced Memory Management

      解决它的最简单方法是将内容复制到 ram 磁盘(例如 \temp);计划 B 是使用链接 Marshal.AllocHGlobal 或 P/Invoke VirtualAlloc(可怕!)以及 GCHandle.Pin

      【讨论】:

        【解决方案5】:

        根据使用 .NET CF 进行编程的经验,您会遇到内存限制,并且垃圾收集与普通桌面/PC 环境中的预期不同。

        在我的应用程序中,通过始终在对象超出范围之前调用 Close() 和 Dispose() 方法解决了我遇到的内存不足异常的问题。

        如果您仍然有问题,另一种尝试方法是挂接到应用程序关闭事件处理程序并调用 GC.Collect()。这将强制垃圾收集器立即收集所有未使用或已处置的对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-27
          • 2013-09-15
          • 2016-05-21
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          相关资源
          最近更新 更多