相关疑难解决方法(0)

使用字节数组时堆积碎片

我有一个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)

如何避免托管内存碎片?

c# bytearray large-object-heap memory-fragmentation

17
推荐指数
1
解决办法
5330
查看次数

大对象堆中的大字符串会导致问题 - 但无论如何它必须以字符串形式结束

我在这里跟进这个问题

我遇到的问题是我有一些来自MSMQ的大型对象,主要是字符串.我已经将我的内存问题缩小到在大对象堆(LOH)中创建的这些对象,因此将其分段(在探查器的帮助下确认).

在我上面发布的问题中,我得到了一些解决方法,主要是将String拆分为char数组,我做了.

我面临的问题是,在字符串处理结束时(无论采用何种形式),我需要将该字符串发送到另一个我无法控制的系统.所以我想到以下解决方案将此字符串放在LOH中:

  1. 将其表示为每个小于85k的char数组数组(要放置在LOH中的对象的阈值)
  2. 在发送方端压缩它(即在我们在这里讨论的系统中接收它之前,它是接收方)并在将其传递给第三方系统之前将其解压缩.

无论我做什么 - 不管怎样 - String必须完整(没有char数组或压缩).

我被困在这里吗?我在想如果在这里使用托管环境是一个错误,我们是否应该咬紧牙关去寻找C++类环境.

谢谢,Yannis

编辑:我已经缩小的问题正好代码贴在这里

通过的大字符串放在LOH中.我从已经收到消息的点开始删除了每个处理模块,并且内存消耗趋势保持不变.

所以我想我需要改变这个WorkContext在系统之间传递的方式.

.net c# memory-management large-object-heap c#-4.0

7
推荐指数
1
解决办法
1762
查看次数