我正在运行一个大型 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。
对不起,这是冗长的......我有办法阻止这些内存泄漏吗?或者在不回收应用程序池的情况下清除它们?我可以找到正在缓存的类/代码以查看是否可以修复泄漏吗?