我在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
答案 0 :(得分:4)
您不应该像这样重用StringBuilder
,只需根据需要创建一个新的。{/ p>
当你在Clear
上调用StringBuilder
时,它不会释放它使用的所有内存,它只会将使用的大小重置为零。它仍将具有相同的大缓冲区,并且重复使用StringBuilder
仅意味着缓冲区将尽可能大,并且永不缩小。
此外,保留StringBuilder
个对象以供重用意味着它们会进行垃圾收集并转移到下一代堆。这些收集频率较低,因此它们更容易对内存碎片产生敏感性。
答案 1 :(得分:4)
我同意,很可能你没有内存不足而是碎片化。
你必须熟悉碎片和大对象堆(LOH)。
您不提供任何详细信息,因此我只能提供一些非常广泛的建议:
修改
输入的最大记录大小& stringBuilder:4 146 698。
sb1 = new StringBuilder(4200000);
答案 2 :(得分:0)
我最终做的是迁移到 x64 。这解决了我的问题。
虽然我没有全部使用它,但我可能会精确地分配x86的整个内存空间。迁移到x64肯定会解决这个问题。