我们有一个.NET 4.0 Windows服务,现在已经使用了很长时间。 Windows服务基本上使用后台线程处理大量文件。我们使用ThreadPool类,而不是Thread类。当Windows服务开始遭受性能下降时,我们采取的步骤之一是使用DebugDiag获取进程的转储。该报告表明该过程有死线。每个转储的死线数也不同。
经过一些研究,我们遇到一个条目,解释死线程是托管线程对象,其中底层本机线程不再存在。这些死线程可能只是ThreadPool中的托管线程吗?如果是这样,为什么ThreadPool会有已经死的托管线程。
为了进一步调查我们死线程的原因,我们尝试分析一个空白Windows服务的转储。在本练习中,我们不断在报告中看到3个死线程。我们使用的Windows服务是使用Visual Studio 2012创建的默认Windows服务,没有用户代码,空白的OnStart和OnStop方法,除了VS2012添加的引用之外没有终结器和其他库引用。
以下是我们对死线程的主要关注: - 这些死线程是否适用于任何.NET Windows服务? - 什么通常导致死线? - 死线程是否导致内存泄漏? - 死线程导致CPU未得到充分利用吗? - 我们是否应该关注这些死神?