我正在运行一个大型的ASP.net 4.0网站。它使用流行的.Net内容管理系统,拥有数以千计的内容条目,数以百计的并发用户--基本上是一个繁重的网站。
在1天的时间内,IIS7工作进程的内存使用量可能会上升到8-10 to。服务器安装了16 is,当前设置为每天回收一次应用程序池。
我面临着减少内存使用的压力。大部分内存使用是由于缓存大型数据字符串-但缓存间隔仅设置为5-10分钟-因此这些字符串最终应该在内存中过期。
但是,在运行RedGate内存分析器之后,我可以看到我认为是内存泄漏。我已经根据对象过滤了我的实例列表结果,这些对象“完全由已处置的对象保存在内存中”(我在RedGate论坛上看到,这是您查找内存泄漏的方法)。这给了我一个很长的字符串列表,这些字符串被保存在内存中。
对于每个字符串,我使用实例保留图来查看是什么将其保存在内存中。System.Web.Caching.CacheDependency似乎在某个时候缓存了System.string对象。如果我沿着这张图一直往上走,它会遍历各种其他类,包括System.Collections.Specialized.ListDictionary,直到它到达System.Web.FileMonitor。这是有意义的,因为字符串是文件(图像/PDF/等)的路径。
CMS似乎正在缓存文件的路径,但这些缓存的对象随后被“泄漏”。随着时间的推移,这会累积并消耗RAM。
抱歉,这是长篇大论。有没有办法阻止这些内存泄漏?或者在不回收应用程序池的情况下清理它们?我是否可以找到正在进行缓存的类/代码,以查看是否可以修复泄漏?
发布于 2013-02-20 20:08:58
这听起来像是一个非常常见的问题,即内容作为会话状态的一部分留在内存中。如果是这种情况,你唯一的选择是1.不要在每个用户的会话中放太多东西,2.将会话生存期设置为更短的值(我想默认是20分钟),3.定期回收应用程序池。
作为1的一部分,我发现在数据网格控件中显示数据有“好的方法”和“坏的方法”。您可能希望检查是否只复制了所需的数据,而不是意外地维护了对整个数据网格的引用。
https://stackoverflow.com/questions/14978522
复制相似问题