2008-12-17 23 views
1

环境: Windows 2003 Server(32位); IIS6,ASP.NET 2.0(3.5); 4Gb Ram; 1工作进程ASP.NET - 单个大型Web请求触发器System.OutOfMemoryException - 仍有大量可用内存

我们有一个情况,我们有一个非常大的System.XmlDocument被加载到内存中,然后它进入一个编译的XSL转换。 发生什么事情时,Web请求进入服务器正在与2500Mb的可用系统内存空闲状态。

随着XML DOM被填充,可用内存下降约500Mb,此时我们得到System.OutOfMemoryException事件。在这一点上,系统理论上仍然有2000Mb的可用内存可用于服务请求(根据Perfmon)。

我已经在相关的问题:

1)在堆栈中的什么水平,这是内存不足的限制得到满足? OS? IIS? ASP.NET?工作流程?这是每个Web请求限制吗?

2)此限制是否可以在某处进行配置?

3)为什么不能访问完整的可用系统内存?

+0

我也想到了这一点,我认为对操作系统的工作进程或对IIS工作进程的限制或对应用程序池的限制都有限制。祝你好运:\ – Shawn 2008-12-18 00:04:46

+0

x86(32位)是一个痛苦的世界。我知道这是一个延伸,但是您可以在64位版本的Windows Server上运行此代码吗?在服务器上64位是非常多的,我的意思是这个字面上,*免费perforamnce * – 2008-12-18 04:34:03

+0

谢谢杰夫,x64(和32GB内存)是2个月的时间了,所以我们可能只能挂在那里。我喜欢在软件问题上抛硬件! – 2008-12-18 09:10:47

回答

1

1)我会猜测工作进程,但这应该可以在IIS内配置为工作进程可以使用的内存限制。另一个因素是您的软件使用什么级别的位,例如32位的物理限制为4 GB,因为这是总地址空间。

2)可能但不要忘记,内存碎片可能会比你想像的更快地发挥内存溢出的作用,例如,如果有连续1000 Mb内存的内存请求,那么在当前内存中可能不一定会找到该内存。

3)您是否检查过转储数据以查看引发异常时内存中的内容?如果没有,有办法获得内存快照,看看它看起来像什么,因为这可能会给你更多线索关于正在发生的事情。

0

我确定这里有一些光明的头可以回答你的具体问题,但你问自己是否有另一种方法去做你想要的东西?我特别指您可能不想处理一个非常大的XML文档,但您可能更具体地想要将某些内容返回给客户端。您是否可以重写代码以完全避免此XML文档,或者可能不会同时将其全部加载到内存中,并且仍会产生相同的最终结果?

+0

是的,我知道有很多更好的方法可以使用更高效的体系结构来实现相同的结果。 但是,这是传统转换,其复杂的商业规则花费了100多天的时间来重新设计。 配置我们的服务器来处理这个请求(如果可能的话)更有意义。 – 2008-12-18 00:08:29

0

1)不知道。检查你的日志。
2)IIS限制内存分成网站/应用程序池。检查您的设置。
3)服务器都是关于正常运行时间;如果一个应用程序占用了其他人所有的资源。这就是为什么像IIS这样的企业应用程序会限制内存以防止逃跑从而取消整个服务器。

+0

这是在ASP.NET中运行的引发System.OutOfMemoryException的CLR。我自己的知识和研究并不一定告诉我IIS下面的堆栈在哪里受到这样的限制?也许别人知道? – 2008-12-18 00:13:50

1
  1. 您正在运行一个进程。一个进程只能访问2个内存。此任务与此过程中运行的其他任何内容共享内存,因此这一点代码无法获得完整的2个演出 - 即使它可用。 操作系统上还有一个3 gig的开关。我相信这是一个注册表设置。但是您必须搜索MSDN才能找到该信息。

但实际上,您需要以另一种方式做到这一点。可能通过切换到SAX风格的XML解析器。