ASP.NET / WCF:为什么逻辑/物理线程在完整的GC循环中丢失?

时间:2010-03-10 19:20:43

标签: c# asp.net wcf multithreading garbage-collection

最近我记录了几个小时的WCF服务的.NET内存计数器。该服务托管在IIS上的Win2k8,8核,x64和20GB内存。

我可以看到GC非常健康,仅执行完整的收集。每隔2小时!

我注意到在同一时间段内,物理和逻辑线程的数量增加了。当完整集合发生时,物理和逻辑线程的数量会减少并继续再次提升到相同的级别。

为什么GC完整收集周期和线程下降相关? 为什么线程数不断增加?

这是纯ASP.NET / WCF线程模型。没有生成自定义线程等。

谢谢, 亚历

1 个答案:

答案 0 :(得分:1)

看起来答案确实非常简单:线程随着时间的推移而随着线程池的增长而缩小。通常情况下,这些线程具有相对较长的使用寿命,这意味着它们最终会在第2代结束。这就是为什么它们自然只能在完整的GC循环中清理。

有趣的是,一个非常好的内存管理应用程序最终可能会遇到一些死线程,我可以在WinDbg中观察到它们。这是因为Full GC可能只在几小时甚至几天后发生!一些MS博客说,那些死线程并不是一件非常好的事情,因为相应的非托管C ++线程对象似乎是资源密集型的(不能再找不到该死的博客......)。我想知道这是否是诱导全GC在某个时间间隔内有意义的罕见情况之一。