如何解决stringBuilder碎片?

时间:2011-05-14 10:45:57

标签: c# .net stringbuilder memory-fragmentation

我在StringBuilders中获得了一个很好的SystemOutOfMemory异常。这不是因为缺乏内存,因此我认为这是内存碎片。

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

谢谢:)

修改

以下是一些数据:

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

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

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

StringBuilder length @ first error:16

新stringBuilder的制作次数@第一次错误:~32500

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

3 个答案:

答案 0 :(得分:4)

您不应该像这样重用StringBuilder,只需根据需要创建一个新的。{/ p>

当你在Clear上调用StringBuilder时,它不会释放它使用的所有内存,它只会将使用的大小重置为零。它仍将具有相同的大缓冲区,并且重复使用StringBuilder仅意味着缓冲区将尽可能大,并且永不缩小。

此外,保留StringBuilder个对象以供重用意味着它们会进行垃圾收集并转移到下一代堆。这些收集频率较低,因此它们更容易对内存碎片产生敏感性。

答案 1 :(得分:4)

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

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

您不提供任何详细信息,因此我只能提供一些非常广泛的建议:

  • 尝试估算字符串的大小,并将Capacity参数用于新的SB
  • 向上(确实)那些大小转换为某个数字的倍数。这促进了重复使用。
  • 只有当您希望新内容与旧内容几乎相同时才使用Clear(),这会让您感到害怕。

修改

  

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

  • 确保没有更大尺寸的中间体,然后
  • 创建所有StringBuilder,例如sb1 = new StringBuilder(4200000);
  • 不要试图重复使用它们(太多/根本没有)
  • 不要把它们放得太久

答案 2 :(得分:0)

我最终做的是迁移到 x64 。这解决了我的问题。

虽然我没有全部使用它,但我可能会精确地分配x86的整个内存空间。迁移到x64肯定会解决这个问题。