c# - 使用字节数组时的堆碎片

标签 c# bytearray large-object-heap memory-fragmentation

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

相关文章:

.net - 从数据库中读取大字符串而不分割大对象堆

c# - 在 session 中缓存搜索结果与保持大对象堆清洁

.net - 我如何知道给定类型的 .net 数组可以分配的实际最大元素数?

c# - 在 C# 中检查是否为字符串格式的条件

c# - 如何在不阻塞的情况下调用 NetworkStream.Read()?

actionscript-3 - 如何将 RGBA 值流编码为视频?

actionscript-3 - 使用byteArray和Adobe Air生成x秒的静音音频文件

c# - C DLL 处理从 C# 调用的 FILE * - 传入和传出流

c# - WCF 单一身份验证多端点

c# - 对 NDepend 图中的命名空间进行分组