【发布时间】:2010-12-18 16:09:48
【问题描述】:
我需要在循环中不断构建大字符串并将它们保存到目前偶尔会产生OutOfMemoryException的数据库中。
这里的基本情况是我根据一些数据使用XmlWriter 和StringBuilder 创建一个字符串。然后我从外部库中调用一个方法,将这个 xml 字符串转换为其他字符串。之后,转换后的字符串将保存到数据库中。整个过程针对不同的数据循环重复执行大约 100 次。
字符串本身并不太大(每个小于 500kByte),并且在此循环期间进程内存没有增加。但是,偶尔我会在StringBuilder.Append 中得到OutOfMemeoryExcpetion。有趣的是,这个异常不会导致崩溃。我可以捕获该异常并继续循环。
这里发生了什么?为什么我会得到OutOfMemoryException,尽管系统中仍有足够的可用内存?这是一些 GC 堆问题吗?
鉴于我无法绕过转换所有这些字符串,我可以做些什么来使这项工作可靠地工作?我应该强制进行 GC 收集吗?应该将Thread.Sleep 放入循环中吗?我应该停止使用StringBuilder 吗?遇到OutOfMemoryException 时是否应该简单地重试?
【问题讨论】:
标签: c# memory garbage-collection stringbuilder