c# - 一次构建一个大字符串并将其传递给 response.write 或为每个片段调用 response.write 是否更有效

标签 c# asp.net out-of-memory memory-fragmentation

<分区>

我们的 ASP.Net 4.0 网站每天都会遇到 OutOfMemoryExceptions。我们怀疑其中一个问题是 LOH 碎片,因此我们一直在研究可以更有效地分配内存的代码更改。

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

是否更有效:

  1. 在 StringBuilder 中构建字符串,然后调用 Response.Write(bigString)
  2. 通过重复调用 Response.Write(smallString) 来零碎地写入字符串

如果我遵循选项 1,那么我会得到一个占用 LOH 空间的大字符串,然后将其复制到 Response 对象的内部缓冲区。所以这看起来我现在至少暂时在 LOH 上有 2 个大块。

如果我遵循选项 2,那么我将处理许多被垃圾收集的小字符串,并且只有 LOH 上的一个大块用于响应对象的缓冲区。

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

我理解正确吗?

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

最佳答案

在不知道实现的情况下,我的回答可能没有我希望的那么有用。不过,我会冒险一试。

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

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

关于c# - 一次构建一个大字符串并将其传递给 response.write 或为每个片段调用 response.write 是否更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24025903/

相关文章:

html - IE9 的 CSS 圆 Angular 问题

c# - 系统内存不足异常

java - PermGen 空间 - maven m2e tomcat7

C#:使用 LINQ 计算一个列表中某个字符串在另一个列表中的出现次数?

c# - 如何使用 GUI 在 Visual Studio 项目中添加和编译 Windows 窗体,而不是直接从 Visual Studio?

c# - Azure 云服务上服务网站的相对路径

c# - 在 ASP.net 解决方案中使用 Unity IOC 容器

c# - 身份服务器4 : connect/authorize/callback address not found behind Nginx reverse proxy

c# - 在专用服务器上的 IIS 7 上运行 .net webservice 时出错

php - fatal error : Out of memory (allocated 1979711488) (tried to allocate 131072 bytes) error occur while writing xlsx file using phpexcel