C#:GC会收集是否需要内存,还是会给出内存异常?

时间:2011-05-18 18:21:45

标签: c# memory-management garbage-collection large-object-heap

我的代码中有一个循环,它生成许多byte []数组(每个大约1到2 MB),用数据填充它们,然后丢弃引用。因此,即使参考仅用于a 短时间内,我可以看到私人工作集的增长。

现在,如果我在循环后尝试分配一个大型数组(~400 MB),我是否可以获得内存不足异常?或者分配会强制GC收集瞬态数据吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

生成许多1-2MB阵列是一个坏主意。即使你避免内存不足,性能也会受到影响。在大对象堆上分配许多短期对象是当前GC无法很好地处理的分配模式。

我强烈建议尽可能回收它们。一旦您不再需要它们,就实现一个池,将数组抛出。然后在分配第一次检查时是否可以满足池中的请求。这种模式在我的一个程序中带来了巨大的性能优势。

我认为完整内存强制GC,但如果非托管分配大约在同一时间发生,你仍然可以获得OOM。

答案 1 :(得分:1)

如果您对此感到担心,可以随时调用GC.Collect();在循环之后的那个大数组之前,这将强制所有代的垃圾收集。然而,不要在循环中进行,除非你不关心时间,因为这可能相当慢(循环太慢,而不是一次性的东西。)

答案 2 :(得分:0)

这实际上取决于。您无法确定垃圾收集器是否会及时丢弃。对于字节数组,您是相当安全的,但是如果在不使用dispose()方法的情况下大量使用它们,大多数对象都会被丢弃。 即使您可能已丢弃所有引用,也会导致内存不足异常 如果您遇到问题,可以尝试GC.Collect(0);,尽管这通常是不合适的。