我有一个 C# 4.0 应用程序(单一生产者/单一消费者),它以块的形式传输大量数据。虽然没有新的内存分配,但一段时间后我的内存就用完了。
我使用 Redgate 内存分析器对内存进行了分析,那里有很多可用内存。它说由于碎片而无法使用空闲内存。
我使用阻塞集合作为缓冲区,使用字节数组作为成员:
BlockingCollection<byte[]> segments = new BlockingCollection<byte[]>(8);
// producer:
segments.Add(buffer);
// consumer:
byte[] buffer = _segments.Take();
如何避免托管内存碎片?