我的代码中有一个循环,它生成许多byte []数组(每个大约1到2 MB),用数据填充它们,然后丢弃引用。因此,即使参考仅用于a 短时间内,我可以看到私人工作集的增长。
现在,如果我在循环后尝试分配一个大型数组(~400 MB),我是否可以获得内存不足异常?或者分配会强制GC收集瞬态数据吗?
谢谢!
答案 0 :(得分:2)
生成许多1-2MB阵列是一个坏主意。即使你避免内存不足,性能也会受到影响。在大对象堆上分配许多短期对象是当前GC无法很好地处理的分配模式。
我强烈建议尽可能回收它们。一旦您不再需要它们,就实现一个池,将数组抛出。然后在分配第一次检查时是否可以满足池中的请求。这种模式在我的一个程序中带来了巨大的性能优势。
我认为完整内存强制GC,但如果非托管分配大约在同一时间发生,你仍然可以获得OOM。
答案 1 :(得分:1)
如果您对此感到担心,可以随时调用GC.Collect();在循环之后的那个大数组之前,这将强制所有代的垃圾收集。然而,不要在循环中进行,除非你不关心时间,因为这可能相当慢(循环太慢,而不是一次性的东西。)
答案 2 :(得分:0)
这实际上取决于。您无法确定垃圾收集器是否会及时丢弃。对于字节数组,您是相当安全的,但是如果在不使用dispose()
方法的情况下大量使用它们,大多数对象都会被丢弃。
即使您可能已丢弃所有引用,也会导致内存不足异常
如果您遇到问题,可以尝试GC.Collect(0);
,尽管这通常是不合适的。