2013-02-20 72 views
6

我正在运行一个大的ASP.net 4.0网站。它使用流行的.Net内容管理系统,拥有数千个内容项,数百个并发用户 - 基本上是一个沉重的网站。使用RedGate Memory Profiler了解ASP.net中的内存泄漏

在1天的过程中,IIS7工作进程的内存使用量可能会增加到8-10GB。该服务器已安装16GB,并且目前每天都设置为回收应用程序池一次。

我受到压力以减少内存使用量。大部分内存使用量都是由于缓存大量数据 - 但缓存时间间隔仅设置为5-10分钟 - 因此这些字符串最终应该从内存中过期。

但是在运行RedGate Memory Profiler之后,我可以看到我认为是内存泄漏。我已经通过“仅由存储对象保存在内存中”的对象(我在RedGate论坛上阅读过,这是如何发现内存泄漏)过滤了我的实例列表结果。这给了我很长的内存中保存的字符串列表。

对于每个字符串,我使用实例保留图来查看内存中的内容。 System.string对象似乎已被System.Web.Caching.CacheDependency缓存。如果我一直遵循图形,它会经历各种其他类,包括System.Collections.Specialized.ListDictionary,直到它到达System.Web.FileMonitor。这是有道理的,因为字符串是文件的路径(图像/ PDF /等)。

看来,CMS正在缓存文件路径,但这些缓存的对象然后“泄漏”。随着时间的推移,这会增加并消耗RAM。

对不起,这是漫长的...有没有办法让我停止这些内存泄漏?或者在不诉诸回收应用程序池的情况下清除它们?我可以找到什么类/代码正在做缓存,看看我是否可以修复泄漏?

回答

0

这听起来像东西作为会话状态的一部分留在内存中的常见问题。如果是这样,你的唯一选择是1.不要在每个用户的会话中放置太多东西,2.将会话生存期设置为更短的时间(我认为默认值是20分钟),以及3.定期回收应用程序池。

作为1的一部分。我发现在数据网格控件中呈现数据有“好方法”和“坏方法”。您可能需要检查您是否只复制了您需要的数据,而不是意外地保持对整个数据网格的引用。

+0

我们已经在回收应用程序池,但客户将此视为一种解决方法,而不是解决方案。他们有理由说,应用程序不应该使用太多的内存。 – 2013-02-20 13:18:40

+0

'System.Web.Caching.CacheDependency'相当于ASP.NET缓存的使用,而不是会话中的缓存。除非缓存键是用户特定的(完全不推荐并且可能导致这些类型的问题),否则此缓存在某种程度上是静态的并且为所有用户共享。回收池或降低会话超时只会限制Web应用的生命周期,而不会限制内存使用。 – JoeBilly 2013-08-07 13:55:42