最近我记录了几个小时的WCF服务的.NET内存计数器。该服务托管在IIS上的Win2k8,8核,x64和20GB内存。
我可以看到GC非常健康,仅执行完整的收集。每隔2小时!
我注意到在同一时间段内,物理和逻辑线程的数量增加了。当完整集合发生时,物理和逻辑线程的数量会减少并继续再次提升到相同的级别。
为什么GC完整收集周期和线程下降相关? 为什么线程数不断增加?
这是纯ASP.NET / WCF线程模型。没有生成自定义线程等。
谢谢, 亚历
答案 0 :(得分:1)
看起来答案确实非常简单:线程随着时间的推移而随着线程池的增长而缩小。通常情况下,这些线程具有相对较长的使用寿命,这意味着它们最终会在第2代结束。这就是为什么它们自然只能在完整的GC循环中清理。
有趣的是,一个非常好的内存管理应用程序最终可能会遇到一些死线程,我可以在WinDbg中观察到它们。这是因为Full GC可能只在几小时甚至几天后发生!一些MS博客说,那些死线程并不是一件非常好的事情,因为相应的非托管C ++线程对象似乎是资源密集型的(不能再找不到该死的博客......)。我想知道这是否是诱导全GC在某个时间间隔内有意义的罕见情况之一。