我有一个 ASP.NET 2.0 应用程序,在生产级服务器(双四核,4g)上进行负载测试时,它在垃圾收集上花费了超过 40% 的时间。我一直试图找出问题所在,但它是一个庞大而复杂的代码库,导致进展缓慢。没有 GC.Collect() 调用。在尝试隔离此类问题时,哪些工具、技术等很有帮助?
5 回答
在查看此类问题时,我发现Tess Ferrandez 博客上的调试实验室非常有帮助。
首先使用.Net CLR Profiler分析您的应用程序(它有一个漂亮的 GUI 用于显示收集的数据,而且它是免费的!)。可以在此处找到有关如何分析 ASP.Net 应用程序的具体说明,本文是关于内存/性能问题、分析和 .Net CLR Profiler 的 GC 的一个很好的概述。
尝试查看您的团队中是否有人实际上已经覆盖Dispose()
了经常调用的方法GC.Collect()
。这发生在我的团队中,结果非常糟糕,其中一种Dispose()
方法需要 1 秒才能执行。
这是我可以想象您的服务器将 40% 的时间用于垃圾收集的唯一方法。
好吧,首先,我的特技膝盖正在起作用,当它发生这种情况时,它要么意味着它即将下雪,要么有人一直在使用大量“+”运算符进行字符串连接,而不是像上帝那样使用 StringBuilder .
蚂蚁探查器呢?我曾经使用过一段时间并且喜欢它。还有一个Profiling API,您可以使用它来捕获您自己的数据。
在整个应用程序崩溃前不久,我发现 GC 耗尽了 100% 的 CPU 时间。问题是“对象泄漏”,我们一次泄漏 20mb。最终 GC 放弃尝试,内存耗尽。
您可以使用 perfmon 看到它执行此操作的时间,有一个 GC 对象有很多计数器。