我有一个 C# 4.0 应用程序(单一生产者/单一消费者),它以 block 的形式传输大量数据。虽然没有新的内存分配,但我在一段时间后内存不足。
我使用 Redgate 内存分析器分析了内存,那里有很多空闲内存。它说由于碎片无法使用空闲内存。
我使用阻塞集合作为缓冲区,使用字节数组作为成员:
BlockingCollection<byte[]> segments = new BlockingCollection<byte[]>(8);
// producer:
segments.Add(buffer);
// consumer:
byte[] buffer = _segments.Take();
如何避免托管内存碎片?
最佳答案
您可能遇到了大对象堆问题 - 大于 85,000 字节的对象放在未压缩的大对象堆上,这可能会导致奇怪的内存不足情况。虽然显然 .NET 4 中的性能已得到改进,但它远非完美。解决方案基本上是使用您自己的缓冲池,其中包含一些静态分配的内存块并重用它们。
SO 上有一大堆问题。
更新:微软提供了一个buffer manager作为 WCF 堆栈的一部分。还有one on codeproject .
关于c# - 使用字节数组时的堆碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696377/