我们想要记录内存异常即将发生的时候,以便我们可以尝试找到模式。最好的方法是什么?
是否有一种方法每隔一分钟查询一次内存使用情况,并发送警报电子邮件?或者编写一个应用程序来监视CLR的内存使用情况?任何想法或方向都非常欢迎。
我正在使用性能监视器,但除非我在观察进程,否则它就没有那么有用。我只能看到发生了什么和什么时候发生了。我还使用了Red Gate内存分析工具,顺便说一下,它很棒 - 只是我似乎无法找到引起异常的页面或进程。
我正在使用性能监视器,但除非我在观察进程,否则它就没有那么有用。我只能看到发生了什么和什么时候发生了。我还使用了Red Gate内存分析工具,顺便说一下,它很棒 - 只是我似乎无法找到引起异常的页面或进程。
请在您的服务器上安装ADPlus(它是Windows Debugging Tools的一部分)。当您开始观察到异常高的内存使用率时,请使用以下命令捕获内存转储:
adplus -hang -p <PID> -quiet -o <dump file folder path>
<PID>
是工作进程的进程ID,您可以从tasklist.exe
获取。
如果您不经常在此问题发生时周围,那么您可以使用DebugDiag自动捕获内存转储:
使用DebugDiag在泄漏跟踪模式下触发进程转储,当您的私有或虚拟内存使用量达到一定阈值时。 话虽如此,我并不总是发现这很可靠。
使用DebugDiag在崩溃模式下捕获转储,每当CLR异常抛出时都会捕获一个转储。 您可以使用高级设置来配置DebugDiag,在遇到类型为System.OutOfMemoryException
的CLR异常时生成完整的内存转储。 这更可靠,并且肯定会触发。 只使用高级设置 -> 异常,不要触碰未配置的首次机会异常,将此设置保留为“无”。
一旦您拥有内存转储,就启动WinDBG,然后加载转储文件,加载SOS并开始探索。
Tess Ferrandez的博客是一个很好的.NET调试资源,她有很多关于如何追踪内存泄漏的文章和实验室(由于链接失效,这些是archive.org的链接):
.NET调试演示实验室6:_内存泄漏
.NET调试演示实验室6:_内存泄漏-回顾
.NET调试演示实验室7:内存泄漏
.NET调试演示实验室7:内存泄漏-回顾
PerfMon计数器很有用,可以用来确认是否存在内存泄漏,但它们并不能完全告诉你整个故事。WinDBG和SOS是你需要使用的工具,可以找出内存使用的位置。
ASP.NET
管理的内存使用。试试 RedGate Memory Profiler。我想它应该可以用于 ASP.NET 网站(他们的性能分析器肯定可以)。