4

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

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

谢谢 :)

编辑:

以下是一些数据:

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

平均重新启动 stringBuilders/秒:>120(可能 >>120)

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

StringBuilder 长度@第一个错误:16

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

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

4

3 回答 3

4

你不应该重复使用StringBuilder这样的,只需根据需要创建一个新的。

当您调用ClearaStringBuilder时,它不会释放它使用的所有内存,它只会将使用的大小重置为零。它仍然具有相同的大缓冲区,并且重复使用StringBuilderonly 意味着缓冲区将尽可能大,并且永远不会缩小。

此外,保留StringBuilder对象以供重用意味着它们可以通过垃圾收集并进入下一代堆。这些收集的频率较低,因此它们更有可能对内存碎片敏感。

于 2011-05-14T11:14:23.650 回答
4

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

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

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

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

编辑

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

  • 确保不需要更大尺寸的中间体,然后
  • 创建所有 StringBuilders 像sb1 = new StringBuilder(4200000);
  • 不要试图重复使用它们(太多/根本)
  • 不要让它们呆太久
于 2011-05-14T11:28:37.117 回答
0

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

有可能我已经分配了 x86 的整个内存空间,即使我没有使用它。迁移到 x64 肯定会解决这个问题。

于 2011-05-15T16:49:38.207 回答