6

我正在运行一个大型 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。

对不起,这是冗长的......我有办法阻止这些内存泄漏吗?或者在不回收应用程序池的情况下清除它们?我可以找到正在缓存的类/代码以查看是否可以修复泄漏吗?

4

1 回答 1

0

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

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

于 2013-02-20T12:08:58.430 回答