我在我的 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/