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