jqu*_*uth 6 c# iis memory-leaks
我们得到了很多内存异常,我们似乎无法诊断正在发生的事情.这似乎是一个问题,会在几分钟内将内存使用率从300兆的增加到千兆以上.现在这是一个IIS应用程序,有3个应用程序域在不同的线程池中运行.
我们想记录内存异常即将发生的时间.所以我们可以尝试找到一种模式.我的问题是:最好的方法是什么?有没有办法每分钟查询内存使用情况,看看有多高,并发送警报电子邮件.或者编写一个可以监控CLR内存使用情况的应用程序?一个想法或方向更受欢迎.
编辑
我正在使用Perfmon,但除非我正在观察这个过程,否则它不是那么有用.我只能看到是什么以及什么时候.我还使用了红门内存配置文件工具,顺便说一句,这很棒,只是我似乎无法点击导致异常的页面或进程.
在您的服务器上安装 ADPlus(它是Windows 调试工具的一部分)。当您开始观察异常高的内存使用率时,使用以下命令捕获内存转储:
adplus -hang -p <PID> -quiet -o <dump file folder path>
Run Code Online (Sandbox Code Playgroud)
<PID>是工作进程的进程 ID,您可以从 获取tasklist.exe。
如果出现此问题时您并不总是在场,那么您可以使用DebugDiag自动捕获内存转储:
当您的专用或虚拟内存使用达到特定阈值时,在泄漏跟踪模式下使用 DebugDiag 来触发进程转储。也就是说,我并不总是觉得这可靠。
每当抛出 CLR 异常时,在崩溃模式下使用 DebugDiag 来捕获转储。您可以使用“高级设置”将 DebugDiag 配置为在遇到类型为 的 CLR 异常时生成完整内存转储System.OutOfMemoryException。这样比较靠谱,肯定会触发。仅使用“高级设置”->“例外”,不要触摸“未配置的第一次机会例外”,将此设置保留为“无”。
获得内存转储后,启动 WinDBG,然后加载转储文件并加载 SOS 并开始查看。
Tess Ferrandez 的博客是一个很棒的 .NET 调试资源,她有大量关于如何跟踪内存泄漏的文章和实验(这些是 archive.org 链接,因为链接已损坏):
.NET 调试演示实验 6:_内存泄漏
.NET 调试演示实验 6:_内存泄漏 - 回顾
.NET 调试演示实验 7:内存泄漏
.NET 调试演示实验 7:内存泄漏 - 回顾
PerfMon 计数器很有用,可用于确认是否存在内存泄漏,但它们并不能说明全部情况。WinDBG 和 SOS 是您需要用来找出内存使用情况的工具。