在我们的 ASP.Net 4.0 网站中,我们每天都遇到 OutOfMemoryExceptions。我们怀疑问题之一是 LOH 碎片,因此我们一直在研究可以更有效地分配内存的代码更改。
例如,我们正在生成一个想要返回给浏览器的大字符串 (2mb)。分页数据不是一种选择。
是否更有效:
- 在 StringBuilder 中构建字符串,然后调用
Response.Write(bigString)
或 - 通过重复调用来逐个编写字符串
Response.Write(smallString)
如果我遵循选项 1,那么我将在 LOH 上占用一个大字符串,然后将其复制到 Response 对象的内部缓冲区。所以这看起来我现在至少暂时在 LOH 上有两个大街区。
如果我遵循选项 2,那么我将处理大量收集垃圾的小字符串,并且只有 LOH 上的一个大块用于响应对象的缓冲区。
所以在我看来选项2更好。
我是否正确理解这一点?
该服务器有 4gb 的 RAM,运行的是 Windows 2003 32 位。这是服务器上运行的唯一站点。所以每个进程都有 4gb 的地址空间,但只有 2gb 可用。当虚拟字节达到约 1.8Gb 时,我们开始收到 OOM 错误,然后我们回收解决问题的站点约 24 小时。私有字节在 500-800mb 之间变化。我认为问题不在于我们的物理内存不足。