【发布时间】:2011-09-16 12:23:06
【问题描述】:
我正在 Visual Studio 2010 中开发一个相对较大的解决方案。它有多个项目,其中一个是 XNA 游戏项目,另一个是 ASP.NET MVC 2 项目。
对于这两个项目,我都面临同样的问题:在调试模式下启动它们后,内存使用量不断上升。它们分别从 40 和 100MB 的内存使用量开始,但都相对较快地攀升至 1.5GB(分别为 10 和 30 分钟)。之后它有时会回落到接近初始使用量,有时它会抛出OutOfMemoryExceptions。
当然,这表明存在严重的内存泄漏,所以这是我最初试图发现问题的地方。在搜索泄漏不成功后,我尝试定期致电GC.Collect()(大约每 10 秒一次)。在引入这个“hack”之后,内存使用量分别保持在 45 和 120MB 24 小时(直到我停止测试)。
.NET 的垃圾收集应该“非常好”,但我不禁怀疑它只是没有完成它的工作。我使用 CLR Profiler 试图解决这个问题,它表明 XNA 项目似乎已经保存了很多我确实在使用的字节数组,但是应该已经删除了对它们的引用,因此被垃圾收集了收集器。
再次,当我定期致电GC.Collect() 时,内存使用问题似乎已经消失。有谁知道什么可能导致这种高内存使用?是否可能与在Debug模式下运行有关?
【问题讨论】:
-
Release 模式下是否会重复同样的问题?
-
单个字节数组有多大?它们可能已被放入大对象堆中,它不像其他所有东西那样经常被收集。系统是否存在内存压力?
-
您用于“内存使用”的值是多少?虚拟大小?私有字节?
-
@agent-j LOH 对象被收集,但 GC 不会对 LOH 中的可用空间进行碎片整理,因此即使内存中没有太多对象,应用程序也会遇到内存不足的问题。
-
在我们下结论之前,让我们确保它们确实是大数组。除非您想深入了解
son of strike并查看它们在哪个堆中。@AlexAtNet,关于碎片的好点。我从未真正见过它,但我不得不寻找一两次。
标签: c# .net garbage-collection