c# - stringBuilder碎片化如何解决?

标签 c# .net stringbuilder memory-fragmentation

我在我的 StringBuilders 中遇到了一个很好的 SystemOutOfMemory 异常。这不是由于缺少内存,因此我认为这是内存碎片。

我有大约 200 个 StringBuiler 对象。所有这些都定期重复使用(使用 strBldr.clear())。这似乎导致我的系统非常糟糕地碎片化内存。我该如何解决这个问题?

谢谢:)

编辑:

以下是一些数据:

输入和 stringBuilder 的最大记录大小:4 146 698。

Avarage 重新启动的 stringBuilders/second:>120(可能 >>120)

输入长度@第一个错误:16 972(字符串)

StringBuilder 长度@第一个错误:16

创建新 stringBuilder 的次数@第一个错误:~32500

总 ram 使用@第一个错误 637 448K

最佳答案

我同意,您很可能不是内存不足,而是碎片化。

您必须熟悉碎片和大对象堆 (LOH)。

你没有提供任何细节,所以我只能给出一些非常广泛的建议:

  • 尝试估计您的字符串有多大,并为新的 SB 使用容量参数
  • 将这些大小向上(真的)舍入到某个数字的倍数。这促进了重复使用。
  • 仅当您希望新内容的大小与旧内容几乎相同时才使用 Clear(),增长它会杀死您。

编辑

Max recorded size of input& stringBuilder: 4 146 698.

  • 确保不需要更大尺寸的中间体,然后
  • 创建所有 StringBuilder,如 sb1 = new StringBuilder(4200000);
  • 不要尝试重复使用它们(太多/根本)
  • 不要让他们在身边太久

关于c# - stringBuilder碎片化如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001306/

相关文章:

c# - RichTextBox.Select 与 SubString 方法之间的行为不一致

c# - Twitter API 应用程序专用身份验证(使用 linq2twitter)

c# - CodeDom ReferencedAssemblies 绝对路径

c# - 我需要哪些 SOAP/WS-Security/WS-Addressing/etc 来发送这条消息

java - 优化将StringBuilder的内容写入ServletResponse

从 StringBuilder 进行 toString 转换的 Java 替代品

c# - 按两个值对我的类(class)进行排序

c# - AppDomain 未处理的异常

c# - 禁止在 TextBox 中选择文本

java - 为什么我们需要 StringBuilder 中的容量