我有一个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)
如何避免托管内存碎片?
我遇到的问题是我有一些来自MSMQ的大型对象,主要是字符串.我已经将我的内存问题缩小到在大对象堆(LOH)中创建的这些对象,因此将其分段(在探查器的帮助下确认).
在我上面发布的问题中,我得到了一些解决方法,主要是将String拆分为char数组,我做了.
我面临的问题是,在字符串处理结束时(无论采用何种形式),我需要将该字符串发送到另一个我无法控制的系统.所以我想到以下解决方案将此字符串放在LOH中:
无论我做什么 - 不管怎样 - String必须完整(没有char数组或压缩).
我被困在这里吗?我在想如果在这里使用托管环境是一个错误,我们是否应该咬紧牙关去寻找C++类环境.
谢谢,Yannis
编辑:我已经缩小的问题正好代码贴在这里
通过的大字符串放在LOH中.我从已经收到消息的点开始删除了每个处理模块,并且内存消耗趋势保持不变.
所以我想我需要改变这个WorkContext在系统之间传递的方式.