gpt4 book ai didi

c# - 使用 RedGate Memory Profiler 了解 ASP.net 中的内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 22:01:14 25 4
gpt4 key购买 nike

我正在运行一个大型 ASP.net 4.0 网站。它使用流行的 .Net 内容管理系统,拥有数千个内容项,数百个并发用户 - 基本上是一个重量级网站。

在 1 天的过程中,IIS7 工作进程的内存使用量可能上升到 8-10GB。服务器已安装 16GB,当前设置为每天回收应用程序池一次。

我正面临减少内存使用的压力。大部分内存使用是由于大数据字符串的缓存 - 但缓存间隔仅设置为 5-10 分钟 - 因此这些字符串最终应该从内存中过期。

但是在运行 RedGate Memory Profiler 之后,我可以看到我认为是内存泄漏的情况。我已经通过“仅由 Disposed 对象保存在内存中”的对象过滤了我的实例列表结果(我在 RedGate 论坛上读到这就是您发现内存泄漏的方式)。这给了我一长串保存在内存中的字符串。

对于每个字符串,我使用 Instance Retention Graph 来查看是什么将它保存在内存中。 System.string 对象似乎已在某个时刻被 System.Web.Caching.CacheDependency 缓存。如果我一直沿着图表向上走,它会经过各种其他类,包括 System.Collections.Specialized.ListDictionary,直到到达 System.Web.FileMonitor。这是有道理的,因为字符串是文件(图像/PDF 等)的路径。

看起来 CMS 正在缓存文件的路径,但这些缓存的对象随后被“泄露”。随着时间的推移,这会累积并耗尽 RAM。

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

最佳答案

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

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

关于c# - 使用 RedGate Memory Profiler 了解 ASP.net 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14978522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com