c# - 用于字符串连接的 StringBuilder 抛出 OutOfMemoryException

标签 c# out-of-memory stringbuilder

我们大多倾向于遵循上述最佳实践。

看看String vs StringBuilder

但 StringBuilder 可能会抛出 OutOfMemoryException,即使有足够的可用内存也是如此。它抛出 OOM 异常,因为它需要“连续的内存块”。

一些引用链接 StringBuilder OutOfMemoryException

还有很多......

你们中有多少人遇到过这个问题或意识到了这个问题,你们做了什么来解决这个问题?

有什么我遗漏的吗?

P.S:我不知道这一点。

我已经改写了这个问题。

*** 同样的事情也适用于手动连接(我会验证这一点并更新 SO)。另一件让我担心的事情是系统中有足够的内存。这就是我在这里提出这个问题的原因,以检查是否有人遇到过这个问题,或者代码是否存在严重错误。

最佳答案

您创建的底层字符串还需要一个连续的内存块,因为它表示为一个字符数组(数组需要连续的内存)。如果 StringBuilder 抛出 OOM 异常,您将无法在没有它的情况下构建底层。

如果创建字符串导致 OOM,则您的应用程序中可能存在更严重的问题。

根据澄清进行编辑:

有一小部分情况会在手动连接成功时使用 StringBuilder 构建字符串失败。手动连接将使用所需的确切长度来组合两个字符串,而 StringBuilder 具有不同的内存分配算法。它更具侵略性,可能会分配比字符串实际需要更多的内存。

使用 StringBuilder 还会导致所需内存暂时加倍,因为字符串将在短时间内同时以 System.String 形式和 StringBuilder 存在。

但是,如果一种方式导致 OOM 而另一种方式没有,它仍然可能表明您的程序中存在更严重的问题。

关于c# - 用于字符串连接的 StringBuilder 抛出 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/363680/

相关文章:

java - 处理长火 Drools 中的所有规则

c# - 存储过程参数仅返回第一个字符

c# - 我应该如何在命令栏项目中设置搜索框?

python - Numpy:从非常大的内存映射 Numpy 数组中删除列

android - XML 反序列化期间内存不足

java - 使用 switch 语句运行方法时出现 StackOverflowError

java - 将索引处的所有字符(在 StringBuilder 中)替换为另一个字符串

java - 如何在不先将它们附加到 StringBuilder 的情况下从一堆字符串中创建一个读取器?

c# - 术语 "pending dispatch"是什么意思?

c# - ASP.NET:整个站点都可以访问的变量