C# .NET CF应用程序和内存不足异常

C# .NET CF应用程序和内存不足异常,c#,.net,memory-management,C#,.net,Memory Management,我正在开发一款.NETCF3.5网络游戏。我的问题是,应用程序一开始就加载了所有资源。然而,在随后的发布中,该应用程序在加载资源(尤其是声音或大图像)时会异常地为我提供内存 请告诉我加载所有资源后,您的应用程序占用了多少内存?在默认设置下,我在cca 1.3 GB的专用字节(检查任务管理器和进程内存分配)上遇到了此错误。我假设您没有尝试一次启动多个游戏实例。这听起来像是在游戏关闭后内存没有返回到操作系统。确定是否存在泄漏的一种简单方法是: 重新启动设备 检查内存使用情况 开始游戏,玩几分钟 结束

我正在开发一款.NETCF3.5网络游戏。我的问题是,应用程序一开始就加载了所有资源。然而,在随后的发布中,该应用程序在加载资源(尤其是声音或大图像)时会异常地为我提供内存


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

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

  • 重新启动设备
  • 检查内存使用情况
  • 开始游戏,玩几分钟
  • 结束比赛
  • 等待几分钟,然后再次检查内存使用情况

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

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

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

    以下是一些细节:


    解决这一问题的最简单方法是将内容复制到ram磁盘(例如.\temp);计划B是将link Marshal.AllocHGlobal或P/Invoke VirtualAlloc(可怕!)与GCHandle.Pin一起使用。根据使用.NET CF编程的经验,您可能会遇到内存限制,垃圾收集不像在正常桌面/PC环境中预期的那样

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


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

    1.3 GB?你确定它在.NET上吗?谢谢,应用程序没有正确关闭(任务管理器也没有显示它)。有一个正在执行的连接线程!所以我猜它使应用程序进入后台,所以它没有正确退出。中止线程后,问题不会发生!