Asp.net IIS工作进程使用大量内存?

Asp.net IIS工作进程使用大量内存?,asp.net,iis,memory,worker-process,Asp.net,Iis,Memory,Worker Process,我的服务器上有一个网站,我的IIS工作进程始终使用4GB RAM。我应该检查什么 c:\windows\system32\inetsrv\w3wp.exe 检查中有关内存瓶颈故障排除的部分如果您可以访问源代码,则可能需要检查实现IDisposable的任何对象是否在中使用语句引用,或者在使用完它们后是否被正确处理 使用是一种C#构造,但基本思想是,当您完成时,您正在释放资源 另一件需要检查的事情是,大型对象被置于“进程中”会话状态或缓存中。更多详细信息肯定会有所帮助。应用程序池中运行了多少个应

我的服务器上有一个网站,我的IIS工作进程始终使用4GB RAM。我应该检查什么

c:\windows\system32\inetsrv\w3wp.exe

检查

中有关内存瓶颈故障排除的部分如果您可以访问源代码,则可能需要检查实现IDisposable的任何对象是否在
中使用
语句引用,或者在使用完它们后是否被正确处理

使用
是一种C#构造,但基本思想是,当您完成时,您正在释放资源


另一件需要检查的事情是,大型对象被置于“进程中”会话状态或缓存中。

更多详细信息肯定会有所帮助。应用程序池中运行了多少个应用程序?池中是否有ASP.NET应用程序


如果您正在运行ASP.NET,请仔细查看会话和缓存变量中存储的内容。使用PerfMon检查正在发生的第0、1和2代集合的数量。小心将UI元素存储在会话状态或缓存中,因为这将阻止收集整个页面实例和页面实例的所有子级。最后,检查您是否正在进行大量的字符串连接。这会导致大量对象实例化,因为.NET字符串是不可变的。请考虑改用StringBuilder。

我会检查前面提到的Gulzar中的CLR调优部分

正如其他海报所指出的,任何实现
IDispose
的对象在完成时都应该调用
Dispose()
,最好使用
using
构造

启动
perfmon.exe
并添加以下计数器:

  • 进程\专用字节
  • .NET CLR内存#所有堆中的字节
  • 进程\工作集
  • .NET CLR内存\大对象堆大小
专用字节的增加,而 所有堆计数器中的字节数保持不变表示未管理 内存消耗

增加 两个计数器都表示托管内存 消耗


正如其他人指出的,此问题的常见原因是资源泄漏,win2k3服务器和IIS6也存在已知问题。请创建w3wp进程的小型转储,并使用WinDbg查看内存中有哪些对象。这就是微软IIS支持团队在遇到类似问题时所做的。

我认为这就是问题所在。。。但我已经有SP2了(是的,但是如果字符串在大型对象堆上,如果我没有弄错的话,它们将仅在第2代收集期间收集。