GC.Collect call和OutOfMemory

时间:2011-10-11 11:56:37

标签: .net garbage-collection out-of-memory

当我打电话给GC.Collect一切正常。但如果我评论这个电话,我会及时收到OutOfMemory。看起来很奇怪。 如何找到这个bug?

其他信息 应用程序有一些项目可以引用从2.0到4.0的不同框架 Aplication是一个windows表单应用程序,使用了devexpress。

5 个答案:

答案 0 :(得分:2)

最可能的变种:

  1. 大对象堆碎片。在应用程序中使用了大量高达百万元素的大量集合,例如HashSet,Dictionary等。所有这些集合都不时调用Array.Resize。因此,GC.Collect不会解决探测问题,只会减慢碎片。
  2. 非托管代码
  3. 编辑: 3.在某些情况下,System.Drawing会抛出OOM异常

答案 1 :(得分:1)

你可能忘了丢弃一个物体。您是否使用任何数据库或其他外部资源?

答案 2 :(得分:1)

如果你必须调用GC.Collect,那么出了点问题。您通常不需要调用垃圾收集器。

  1. 尝试使用内存分析器。这将显示有多少类型的对象消耗您的堆。
  2. 检查您的非托管资源。每个非托管资源都必须由一个实现IDispoable和终结器的类来管理。

答案 3 :(得分:0)

在.net中调试内存泄漏的一种常见方法是使用SOS - 扩展(如果你做一些研究,你会找到像this这样的教程)或者使用内存分析器,比如this一个。 Maby你只是忘了释放(处置)一些非托管的资源吗?

答案 4 :(得分:0)

我会尝试使用CLR profiler调试托管内存问题。

另外,你为什么要自己调用GC.Collect()?这通常是一种反模式。