2011-04-26 87 views
2

我已经在那里我们在HttpRuntime.Cache为选择操作存储数据集ONLY(产品总数〜数据的20MB如果数据集保存为XML)的应用程序。Web应用程序的内存使用情况HttpRuntime.Cache

我们迁移到新的Windows 2008服务器的x64,其中已启用IIS站点基于输出缓存。 我们的应用程序池也设置为x64模式。 一切顺利,应用程序正在运行一些严重的负载和约2GB的内存使用情况。

在不改变应用程序,并没有额外的流量,应用程序开始吃了服务器上的所有内存,这是目前7GB。

我试图禁用输出缓存,但它根本没有帮助。解决该问题的唯一方法是回收应用程序池,但此解决方案会导致所有用户会话丢失。

在我的理解,HttpRuntime.Cache项目是全球应用程序池。 我们只是在应用程序加载事件中将项目插入到缓存中,因此应该不会对缓存项目进行任何更改。

随着禁用输出缓存并没有额外插入到缓存中,哪些可能会导致意外的内存增长?

+0

你检查任务管理器(性能 - >资源监视器),看看有什么吃了内存(让你确信它是不是SQL保存内存)?数据库是否在同一台服务器上运行?内存正在使用还是待机? – Ivo 2011-04-26 14:33:47

+0

嗨,数据集通过WebServices填充,此设置上没有数据库服务器。内存应该被使用,因为它不断增长 - 5-20MB/s,CPU使用率为5-12%,直到达到设定的7GB回收限制。 – balint 2011-04-26 14:44:07

回答

1

这听起来像是一个大对象堆的问题。自1.0版本以来,.NET垃圾收集器因无法从内存收集大型对象而臭名昭着。使用.net版本的情况已经有所改善,但特别是在高负载的服务器上仍然存在问题。 查看这些文章来熟悉这个问题:

http://msdn.microsoft.com/en-us/magazine/cc534993.aspx
http://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/
http://www.alexatnet.com/content/net-memory-management-and-garbage-collector

您也可以尝试配置您的开发服务器上的应用程序内存,看看问题是否会出现在那里。