Xaq*_*ron 17 c# bytearray large-object-heap memory-fragmentation
我有一个C#4.0应用程序(单个生产者/单个消费者),它以块的形式传输大量数据.虽然没有新的内存分配,但一段时间后内存不足.
我使用Redgate内存分析器分析了内存,那里有很多可用内存.它说由于碎片化而无法使用空闲内存.
我使用阻塞集合作为缓冲区和字节数组作为成员:
BlockingCollection<byte[]> segments = new BlockingCollection<byte[]>(8);
// producer:
segments.Add(buffer);
// consumer:
byte[] buffer = _segments.Take();
Run Code Online (Sandbox Code Playgroud)
如何避免托管内存碎片?
Chr*_*Wue 10
您可能遇到了大对象堆问题 - 大于85,000字节的对象被放在大型对象堆上,而不会压缩这会导致奇怪的内存不足.虽然.NET 4中的性能显然已得到改善,但它还远非完美.解决方案是基本上使用您自己的缓冲池,其中包含一些静态分配的内存块并重用这些内存.
关于SO的问题有很多问题.
更新:Microsoft提供缓冲区管理器作为WCF堆栈的一部分.codeproject上还有一个.