最近为了解决大文件下载耗内存的问题,费了不少功夫,也遇到许多意想不到的事情,有时间要好好的记上一笔。

  前日,从别人那里看来一段关于下载的代码,把以前的代码修改了下。

Code

  大致上就这个样子,这段代码写法上有很多问题,比如没用finally块集中释放资源,catch不该这么写。

我拿了这段代码就去测试了,最初是在用winxp做web服务器,下载的文件在win2003上,局域网内的两台机子,先后开了6个下载,winxp的内存使用情况也不错。

由于实际环境中web服务器是win2000,所以再把代码放到win2000上测试,问题来了。打开第一个下载还行,再开第二个,两个下载全都崩了,说是连不上服务器。

上win2000一看,电脑速度变得巨慢,点个东西要老半天才有反应,忍无可忍,重启机器。

事件查看器/应用程序 记录了两个错误

1)

事件类型: 错误  

事件来源: ASP.NET   1.1.4322.0  
事件种类: 无  
事件   ID: 1084  
日期:   
事件:
用户:
计算机:
描述:  
aspnet_wp.exe   未能启动。失败的错误代码为800705AA。当辅助进程帐户没有足够的权限读取.NET   Framework   文件时,可能会导致该错误。请确保正确安装了   .NET   Framework,并且安装目录的   ACL   允许访问配置的帐户。   

 2)

事件类型: 错误
事件来源: ASP.NET   1.1.4322.0  
事件种类: 无
事件   ID: 1000
日期:
事件:
用户:
计算机:
描述:

aspnet_wp.exe     (PID:   ****)意外停止。 

  我看了这个挺莫名的,还真去卸载/安装了.Net Framework。 不过问题依旧,这回改查看任务管理器,看谁是用cpu那么猛,hoho,inetinfo.exe,是他!再看性能/物理内存/可用数 只剩下区区4千了,立马去查看究竟那个进程狂用内存了,怪事!内存使用最多的aspnet_wp.exe也只用了区区5千KB,怎么就把我物理内存吃的只剩下4千KB了呢?且慢,再看虚拟内存大小。靠,inetinfo.exe居然占用了1GB的内存,我的天,都是他干的好事。纳闷了,下载的文件也才100MB,inetinfo怎么就到了1G。经过代码调整,发现是Catch处出的问题,希望有哪位看官告诉我为什么会有这样的事儿!

调整后的代码

Code

 改成这样后,inetinfo.exe占用的虚拟内存大小显著下降,问题是解决了,但我就纳闷了,原先的代码到底捕捉到了什么奇怪的异常呢。。。
-----------------------------
2009/3/16
-----------------------------
发生该现象的机器居然坏了,说是硬盘故障。。。没有及时dump,现在什么也做不了了。。