C# ASP.NET/WCF:为什么逻辑/物理线程会在整个GC周期中下降?

C# ASP.NET/WCF:为什么逻辑/物理线程会在整个GC周期中下降?,c#,asp.net,wcf,multithreading,garbage-collection,C#,Asp.net,Wcf,Multithreading,Garbage Collection,最近我记录了一个WCF服务的.NET内存计数器的几个小时。该服务托管在IIS中,位于Win2k8、8核、x64和20GB ram上 我可以看到GC非常健康,大约每2小时执行一次完整的收集 我注意到,在同一时间段内,物理线程和逻辑线程的数量都在增加。当完全收集发生时,物理线程和逻辑线程的数量会下降,并继续上升到相同的水平 为什么GC完整收集周期与插入线程相关? 为什么线程的数量不断增加 这是纯ASP.NET/WCF线程模型。没有生成自定义线程等 谢谢, Alex看起来答案确实很简单:随着时间的推移

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

我可以看到GC非常健康,大约每2小时执行一次完整的收集

我注意到,在同一时间段内,物理线程和逻辑线程的数量都在增加。当完全收集发生时,物理线程和逻辑线程的数量会下降,并继续上升到相同的水平

为什么GC完整收集周期与插入线程相关? 为什么线程的数量不断增加

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

谢谢,
Alex

看起来答案确实很简单:随着时间的推移,线程池会随着时间的增长和收缩而不断创建和消亡。通常情况下,这些线程的使用寿命相对较长,这意味着它们将在第2代中结束。这就是为什么它们只能在一个完整的GC循环中自然清理

有趣的是,一个非常好的内存管理应用程序最终可能会产生大量的死线程,我在WinDbg中观察到了这一点。这是因为完整的GC可能只会在几个小时甚至几天后发生!一些MS博客说,那些死线程并不是一件很好的事情,因为对应的非托管C++线程对象看起来是非常资源密集的(无法再找到该死的博客了……)。我想知道这是否是一种罕见的情况,在这种情况下,在一定的时间间隔内诱导完全GC是有意义的