C#:如果 GC 需要内存,它将收集,或者它会给出内存不足异常
本文关键字:或者 异常 内存不足 GC 内存 如果 | 更新日期: 2023-09-27 17:57:07
我的代码中有一个循环,它生成许多 byte[] 数组(每个数组大约 1 到 2 MB),用数据填充它们,然后丢弃引用。因此,即使引用仅保留为短时间,我可以看到私人工作集的增长。
现在,如果我尝试在循环后分配一个大数组 (~ 400 MB),我可能会得到内存不足异常吗?还是分配会强制 GC 收集瞬态数据?
谢谢!
生成许多 1-2MB 的数组是一个坏主意。即使您避免内存不足的情况,性能也会受到影响。在大型对象堆上分配许多短期对象是当前 GC 无法很好地处理的分配模式。
我强烈建议尽可能回收它们。实现一个池,一旦不再需要数组,就可以将数组扔进去。然后在分配时,首先检查是否可以满足池的请求。这种模式在我的一个程序中带来了巨大的性能优势。
我认为全内存会强制使用 GC,但如果非托管分配大约在同一时间发生,您仍然可以获得 OOM。
如果您担心它,您可以随时致电GC。收集();在循环之后的大数组之前,这将强制所有世代的垃圾回收。 但是,不要在循环中做,除非你不关心时间,因为这可能相当慢(对于循环来说太慢了,对于一次性的事情来说就不那么慢了。
这
真的取决于。您无法确定垃圾回收器是否会及时丢弃。使用字节数组是相当安全的,但是如果您在不使用 dispose()
方法的情况下大量使用它们,则大多数对象被丢弃得太晚了。
这会导致内存不足异常,即使您可能已丢弃所有引用也是如此。
如果您遇到问题,可以尝试 GC.Collect(0);
,尽管这通常是不可取的。