诊断“垃圾收集时间百分比”问题

时间:2008-12-19 01:28:55

标签: asp.net debugging garbage-collection

我有一个ASP.NET 2.0应用程序,在生产级服务器(双四核,4g)上进行负载测试时,在垃圾收集上花费了大量时间,超过40%。 我一直试图找出问题,但它是一个庞大而复杂的代码库,使得速度缓慢。没有GC.Collect()调用。在尝试隔离此类问题时,哪些工具,技术等有用?

6 个答案:

答案 0 :(得分:6)

在查看这些问题时,我发现Tess Ferrandez's blog上的调试实验室非常有用。

答案 1 :(得分:3)

首先使用.Net CLR Profiler分析您的应用程序(它有一个漂亮的GUI用于显示收集的数据,它是免费的!)。有关如何配置ASP.Net应用程序的具体说明可以找到herethis article是关于内存/性能问题,性能分析和.Net CLR Profiler的GC的概述。

答案 2 :(得分:2)

尝试查看您团队中的某个人是否实际上已覆盖Dispose()种方法,以便经常致电GC.Collect()。这发生在我的团队中,并且它非常糟糕,其中一个Dispose()方法需要1秒钟才能执行。

这是我能想象你的服务器将40%的时间花在垃圾收集上的唯一方法。

答案 3 :(得分:1)

感谢Darren的回答,我在Tess Ferrandez's blog http://blogs.msdn.com/tess/archive/2006/06/22/643309.aspx上找到了这篇文章,很好地总结了如何追逐像这样的问题。

答案 4 :(得分:0)

好吧,首先,我的技巧膝盖正在起作用,当它这样做时,它要么意味着即将下雪,要么就是有人使用了很多“+”运算符进行字符串连接而不是使用StringBuilder作为好主意。

ANTS Profiler怎么样?我曾经使用过一段时间并喜欢它。您还可以使用Profiling API来捕获自己的数据。

答案 5 :(得分:0)

我发现GC在整个应用程序崩溃前不久耗尽了100%的CPU时间。问题是“物体泄漏”,我们一次泄漏20mb。最终GC放弃了尝试,内存耗尽。

你可以看到它使用perfmon做多长时间,有一个GC对象有很多计数器。