tig*_*rou 4 c# garbage-collection out-of-memory compile-mode
我有一个C#Console应用程序,它分配了许多小对象和数组.这些物体的使用寿命很短,很快就会被垃圾收集器清理干净.对于"你为什么需要分配如此多的短生命对象,你应该避免这种情况"的问题:该程序用于繁重的AI任务,现在没有明显的方法来解决这个问题.
这是问题所在:
如果我在调试模式x86下运行程序它运行正常并在几分钟后完成所有处理.平均而言,它使用300-400 MB.
如果我采用完全相同的程序,但是在发布x86模式下编译并运行它,程序使用的内存会快速达到2GB(几秒钟内),因此它会抛出一个OutOfMemoryException(这是预期的行为,因为它是一个32位应用程序).在发布x64模式下进行编译并不能解决问题,它会快速使用计算机的所有内存(8GB),然后在内存分配失败时崩溃.
我使用SharpDevelop 4.3.3来构建应用程序.调试和发布模式之间的唯一区别是:
在所有情况下都没有附加调试器.程序非常简短,并且没有编译器指令可以使它在调试或发布时编译时运行方式不同.没有明显的理由来解释这种行为.在发布模式下进行编译时,看起来垃圾收集器从未被触发(或者至少没有足够的时间)并且内存未被释放.
似乎已经提出类似的问题,但它似乎与我的问题不同.
如果终于找到了原因.我的错.
我有一个Debug.Assert()方法调用,不仅执行一些检查,还做了一些操作(例如:) Debug.Assert(List.Remove()).
我假设Debug.Assert()在两种情况下都会执行(释放和调试),并且只有在调试模式下才会测试结果值,但这是错误的.在发布模式下编译时,Debug.Assert()调用将完全从代码中删除.
我给出了答案而不是关闭这个问题,因为它可能对其他人有用.
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |