最近我记录了几个小时的 WCF 服务的 .NET 内存计数器。该服务托管在 Win2k8、8 核、x64 和 20GB 内存的 IIS 中。
我可以看到 GC 非常健康,大约只执行一次完整收集。每 2 小时一次!
我注意到在同一时间段内,物理线程和逻辑线程的数量都在增加。当完全收集发生时,物理和逻辑线程的数量回落并继续上升到同一水平。
为什么 GC 完整收集周期和线程数下降相关? 为什么线程数不断增加?
这是纯 ASP.NET/WCF 线程模型。没有生成自定义线程等。
谢谢, 亚历克斯
最佳答案
看起来答案确实非常简单:线程会随着线程池的增长和缩小而创建和消亡。通常,这些线程具有相对较长的生命周期,这意味着它们会在第 2 代结束。这就是为什么它们自然地只在完整的 GC 周期中进行清理。
有趣的一点是,一个内存管理得很好的应用程序最终可能会出现大量死线程,我在 WinDbg 中观察到了这一点。这是因为 Full GC 可能只在几个小时甚至几天后发生!一些 MS 博客说,那些死线程并不是一件好事,因为相应的非托管 C++ 线程对象似乎非常耗费资源(不幸的是再也找不到该死的博客了……)。我想知道这是否是诱导 Full GC 在特定时间间隔内有意义的罕见情况之一。
关于c# - ASP.NET/WCF : Why are logical/physical threads dropping on full GC cycle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2419838/