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

时间:2008-11-11 08:41:35

标签: c# .net memory-management

我正在开发.NET CF 3.5网络游戏。我的问题是应用程序在第一个实例加载所有资源。然而,在随后的发布中,应用程序在加载资源(尤其是声音或大图像)时为我提供了异常内存。

请指导我

5 个答案:

答案 0 :(得分:2)

我认为你并不是想一次尝试多个游戏实例。这听起来就像游戏关闭后内存没有返回到操作系统。确定是否有泄漏的一种简单方法是:

  1. 重启设备
  2. 检查内存使用情况
  3. 开始游戏,玩几分钟
  4. 关闭游戏
  5. 等待几分钟,然后再次检查内存使用情况
  6. 如果你在内存不足之前可以进行一些启动,那么你会有一些小漏洞。如果您只能在重新启动设备之前启动一次,那么您的设备就会很大。垃圾收集只会到目前为止。如果您正在调用非托管代码(实例化非托管对象的Win32或PInvoke调用),那么您需要确保在游戏关闭时释放这些资源。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

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