【问题标题】:Understanding memory leaks in ASP.net using RedGate Memory Profiler使用 RedGate Memory Profiler 了解 ASP.net 中的内存泄漏
【发布时间】:2013-02-05 09:01:10
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net memory-leaks redgate memory-profiling


    【解决方案1】:

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

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

    【讨论】:

    • 我们已经在回收应用程序池,但客户认为这是一种变通方法,而不是解决方案。他们有理由说应用程序不应该使用这么多内存。
    • System.Web.Caching.CacheDependency 是使用 ASP.NET 缓存而不是会话中的缓存。这个缓存在某种程度上是静态的,并为所有用户共享,除非缓存键是用户特定的(根本不推荐,可能会导致这类问题)。回收池或降低会话超时只会限制 webapp 的生命周期,而不是内存使用量。
    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2018-07-23
    相关资源
    最近更新 更多