一旦构建一个大字符串并将其传递给response.write或为每个字符调用response.write,它是否更有效

use*_*846 5 c# asp.net out-of-memory memory-fragmentation

我们在ASP.Net 4.0网站上遇到了每日OutOfMemoryExceptions.我们怀疑其中一个问题是LOH碎片,所以我们一直在寻找可以更有效地分配内存的代码更改.

例如,我们正在生成一个我们想要返回浏览器的大字符串(2mb).分页数据不是一种选择.

是否更有效:

  1. 在StringBuilder中构建字符串,然后对Response.Write(bigString)or 进行一次调用
  2. 通过重复调用来逐字写出字符串 Response.Write(smallString)

如果我按照选项1然后我有一个大字符串占用LOH上的空格,然后被复制到Response对象的内部缓冲区.所以这似乎我现在至少暂时在LOH上有两个大块.

如果我按照选项2那么我正在处理大量的小字符串,这些字符串会被垃圾收集,并且只有LOH上的一个大块用于Response对象的缓冲区.

所以在我看来选项2更好.

我理解正确吗?

该服务器有4GB的Ram,并运行Windows 2003 32位.这是服务器上运行的唯一站点.因此每个进程都有一个4GB的地址空间,但只有2GB可用.当虚拟字节大约达到1.8Gb时,我们开始收到OOM错误,然后我们回收解决问题大约24小时的站点.专用字节在500-800mb之间变化.我认为问题不在于我们的物理内存不足.

小智 1

在不了解实现情况的情况下,我的回答可能没有我希望的那么有帮助。不过我还是会冒险一试。

如果是我,我会采取两种策略:

  1. 利用硬盘空间并写入存储在服务器上缓存目录中的文本文件(假设只有一台 Web 服务器)
  2. 使用老式的 Server.Execute("~/filename.txt"); 将文本文件内容吐出到您的页面上。