c# - ASP.NET/WCF : Why are logical/physical threads dropping on full GC cycle?

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

最近我记录了几个小时的 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/

相关文章:

WCF Rest - 最佳实践是什么?

c# - WCF 替代跨进程/机器通信

javascript - 在不使用 ScriptManager 的情况下从 Javascript 访问 WCF WebService

c# - error MSB3103 : Invalid Resx file. 找不到指定的模块

c# - 检测具有相同 child 的实体

c# - 访问 C# 变量

asp.net - 如何为 ASP.NET_SessionId cookie 设置 HttpOnly?

c# - 以数组的形式存储 Combobox 项目并在 WPF 中检索 SelectedId

c# - SPFarm.Local 返回 null

c# - 在 ASP.NET 中使用 Ext JS