2010-11-12 135 views
6

我们收到很多内存不足的异常,我们似乎无法诊断发生了什么。这似乎是一个问题,会发生,将内存使用量从300兆增加到几分钟之内的Gig。现在,这是一个IIS应用程序,并有3个应用程序域在单独的线程池中运行。CLR内存异常

我们想记录什么时候内存异常即将发生。所以我们可以尝试找到一个模式。我的问题是:做这件事的最好方法是什么?有没有办法每隔一分钟查询内存使用情况,看看它有多高,并发送警报电子邮件。或者也许写一个应用程序来监视CLR的内存使用情况?一个想法或方向更受欢迎。

编辑

我使用性能监视器,但除非我正在看的过程中它是没有多大用处的。我只能看到什么是和什么时候。我还使用了红门内存配置文件工具,这很棒,只是我似乎无法击中造成异常的页面或进程。

+0

有兴趣知道你发现的是什么 – Kev 2010-11-16 15:44:54

回答

3

在您的服务器上安装ADPlus(它是Windows Debugging Tools的一部分)。当你开始观察异常高的内存使用情况使用捕获内存转储:

adplus -hang -p <PID> -quiet -o <dump file folder path> 

<PID>是工作进程,你可以从tasklist.exe得到的进程ID。

如果你不总是围绕在发生,那么你可以自动化操作捕捉使用DebugDiag内存转储这个问题:

  1. 使用DebugDiag资料泄漏在跟踪模式来触发一个进程转储当你的私人或Virtual内存使用达到一定的门槛。这就是说,我并不总是认为这是可靠的。

  2. 在崩溃模式下使用DebugDiag可在每次抛出CLR异常时捕获转储。您可以使用高级设置将DebugDiag配置为在遇到类型为System.OutOfMemoryException的CLR异常时生成完整的内存转储。这是更可靠,肯定会触发。只使用高级设置 - >例外,不要触摸未配置的第一次机会例外,将此设置保留为无。

一旦你有你的内存转储启动WinDBG,加载转储文件和加载SOS并开始戳。

苔丝Ferrandez的blog是一个伟大的.NET调试资源和她有很多有关如何跟踪内存泄漏的文章和实验室:

If it is broken, fix it you should - memory issue articles

.NET Debugging Demos Lab 6:_Memory Leak
.NET Debugging Demos Lab 6:_Memory Leak - Review
.NET Debugging Demos Lab 7: Memory Leak
.NET Debugging Demos Lab 7: Memory Leak - Review

PerfMon计数器是有用的,可以用来确认你有内存泄漏,但他们没有讲完整个故事。 WinDBG和SOS是你需要使用的工具来找出你的内存在哪里使用。

1

尝试RedGate Memory Profiler。我想它适用于ASP.NET网站(他们的性能分析器肯定会)。

+0

我有它是一个伟大的工具,但没用,如果你不能重现的问题,因为我不知道什么系列事件导致穗是没有帮助的。这是一个伟大的工具,不是不那么简单。 – 2010-11-12 12:55:13

2

Perfromance显示器又名Perfmon是你的朋友 - 这是免费不侵扰重量轻,如果你使用不频繁的采样(每隔几秒钟),可以安全地在生产服务器上运行。它可以做的最低限度是为您的进程(w3wp.exe)采样内存/ CPU使用情况并将它们存储在文件中。

既然你没有分享你在应用程序中做什么,我不能建议性能计数器来存储,但有很多在ASP.NET和.NET和CLR。

由于您收到CLR内存异常,我的预感是GC不工作,由于固定对象或东西。我怀疑它是非托管资源,例如位图,尽管可能会被释放。

这里有计数器的列表,我建议:

.NET CLR内存

  • GC手柄
  • 固定的对象

过程的程序w3wp.exe运行你的应用程序

  • 一对夫妇,但大多工作集

ASP.NET

  • 管理的内存使用
+0

我不认为这是一个固定的对象,我们只在代码中的2个区域插入对象,它们都看起来很好,但它是一个很棒的点! – 2010-11-12 12:58:23

+0

如果您的固定对象计数器升高,将很容易看到。我绝对推荐使用perfmon作为启动。 – Aliostad 2010-11-12 13:02:01

0

使用内存分析器。有几个很好的例子,例如来自Red Gate的JetBrains dotTraceANTS Memory Profiler。有几个讨论在这里stackoverflow有很多其他的提示和建议。

+0

只有当你知道通常要做什么才能找到内存尖峰时,内存分析才有用。 – 2010-11-12 12:56:23

0

我会用ADPlus在“崩溃”模式,以捕获内存转储发生异常时,然后WinDbg中和SOS弄清楚什么是占用所有的内存。

+1

崩溃模式不会转储进程,因为OOM异常通常不会导致工作进程崩溃。 – Kev 2010-11-13 01:25:06

+0

发生异常时,应使用“挂起”模式捕获进程转储。然后转储分析可以显示堆中的内容。 – 2010-11-13 02:02:06

+0

其实,我的错误,但你需要首先配置ADPlus配置脚本​​。在我遇到的95%的案例中,我发现DebugDiag更方便。 – Kev 2010-11-13 02:18:56

0

使用dotTrace或YourToolkit.Net您可以将分析器附加到ASP过程,它们有试用版,所以您不需要立即花钱。使用这些性能分析器,您可以选择内存开始增加的时间线(您可以在图形中直观地看到内存使用情况),因此选择范围和理解导致内存使用情况如此之高的原因很容易。