当前位置:  开发笔记 > 编程语言 > 正文

String连接的StringBuilder抛出OutOfMemoryException

如何解决《String连接的StringBuilder抛出OutOfMemoryException》经验,为你挑选了1个好方法。

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

看看String vs StringBuilder

但是,即使有足够的可用内存, StringBuilder也可能抛出OutOfMemoryException.它抛出OOM异常,因为它需要"连续的内存块".

一些链接供参考 StringBuilder OutOfMemoryException

而且还有更多......

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

有什么我想念的吗?

PS:我没有意识到这一点.

我已经改写了这个问题.

***同样的事情与手动连接一起使用(我将验证这一点并更新SO).引起我担忧的另一件事是系统中有足够的内存.这就是我在这里提出这个问题的原因,以检查是否有人遇到这个问题或者代码有什么严重错误.



1> JaredPar..:

您创建的underyling字符串还需要一个连续的内存块,因为它表示为chars数组(数组需要连续的内存).如果StringBuilder抛出一个OOM异常,那么如果没有它,你将无法构建底层.

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

编辑以回应澄清:

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

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

但是,如果一种方式导致OOM而另一种方式不是,那么它仍可能指向您的程序中更严重的问题.


据我所知,当调用StringBuilder.ToString()方法时,不会分配新字符串的内存,也不会复制数据.创建的String对象与StringBuilder共享相同的内存,StringBuilder进入特殊状态"copy on change".因此,只有在调用ToString()后修改了StringBuilder时,内存才会加倍.
推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有