bit*_*onk 11 c# memory stringbuilder garbage-collection
我需要在循环中连续构建大字符串并将它们保存到数据库中,目前偶尔会产生一个OutOfMemoryException.
这里基本上是基于一些数据使用XmlWriterwith 创建一个字符串StringBuilder.然后我从外部库调用一个方法,将该xml字符串转换为其他字符串.之后,转换后的字符串将保存到数据库中.对于不同的数据,这整个过程在一个循环中重复完成大约100次.
字符串本身不是太大(每个低于500kByte),并且在此循环期间进程内存不会增加.但是,偶尔我会得到一个OutOfMemeoryExcpetion内部StringBuilder.Append.有趣的是,此异常不会导致崩溃.我可以捕获该异常并继续循环.
这里发生了什么?为什么我会得到一个OutOfMemoryException尽管系统中仍有足够的可用内存?这是一些GC堆问题吗?
鉴于我无法绕过转换所有这些字符串,我能做些什么来使这项工作可靠?我应该强制GC收集吗?应该Thread.Sleep进入循环?我应该停止使用StringBuilder吗?应该只是在面对时重试OutOfMemoryException?
Gui*_*ume 14
有内存但没有连续的段可以处理字符串生成器的大小.您必须知道,每次字符串生成器的缓冲区太短时,其大小都会加倍.如果您可以定义(在ctor中)构建器的大小,那就更好了.GC.Collect()完成大量对象后,您可以调用.
实际上,当你有一个OutOfMemory,它通常显示一个糟糕的设计,你可能使用硬盘驱动器(临时文件)而不是内存,你不应该一次又一次地分配内存(尝试重用对象/缓冲区/ ...) .
我强烈建议你阅读这篇文章"Out of Memory"并不是指 Eric Lippert的物理内存.