我正在运行一个大型的ASP.net 4.0网站。它使用了流行的.Net内容管理系统,拥有数千个内容项,数百个并发用户 - 基本上是一个沉重的网站。
在1天的过程中,IIS7工作进程的内存使用量可以增加到8-10GB。服务器已安装16GB,目前设置为每天回收一次应用程序池。
我受到压力以减少内存使用量。大部分内存使用是由于缓存了大量数据 - 但缓存间隔仅设置为5-10分钟 - 因此这些字符串最终应该从内存中过期。
然而,在运行RedGate Memory Profiler后,我可以看到我认为是内存泄漏。我已经通过“由Disposed Objects专门保存在内存中”的对象过滤了我的实例列表结果(我在RedGate论坛上看到这是你发现内存泄漏的方式)。这给了我一长串记录在字符串中的字符串。
对于每个字符串,我使用Instance Retention Graph查看内存中的内容。 System.string对象似乎在某些时候被System.Web.Caching.CacheDependency缓存了。如果我一直遵循图形,它会通过各种其他类,包括System.Collections.Specialized.ListDictionary,直到它到达System.Web.FileMonitor。这是有道理的,因为字符串是文件的路径(图像/ PDF /等)。
似乎CMS正在缓存文件的路径,但这些缓存的对象随后被“泄露”。随着时间的推移,这会积累并占用RAM。
对不起,这是长篇大论......我有办法阻止这些内存泄漏吗?或者在不诉诸回收应用程序池的情况下清除它们?我可以找到正在进行缓存的类/代码,看看我是否可以修复泄漏?
答案 0 :(得分:0)
这听起来像是作为会话状态的一部分留在内存中的常见问题。如果是这种情况,你唯一的选择是1.不要在每个用户的会话中放置太多东西,2。将会话生命周期设置为更短的时间(默认为20分钟,我认为),并且3.定期回收应用程序池
作为1的一部分。我发现在数据网格控件中呈现数据有“好方法”和“坏方法”。您可能希望检查是否只复制了所需的数据,而不是意外地维护对整个数据网格的引用。