2

我们有一个已经使用了一段时间的 .NET 4.0 windows 服务。Windows 服务基本上使用后台线程处理大量文件。我们使用 ThreadPool 类而不是 Thread 类。当 Windows 服务开始遭受性能下降时,我们采取的步骤之一是使用 DebugDiag 获取进程的转储。该报告表明该进程有死线程。死线程的数量也因每个转储而异。

经过一些研究,我们发现了一个条目,解释死线程是托管线程对象,其中底层本机线程不再存在。这些死线程是否可能只是 ThreadPool 中的托管线程?如果是这样,为什么 ThreadPool 会托管已经死掉的线程。

为了进一步调查死线程的原因,我们尝试分析一个空白 Windows 服务的转储。在这个练习中,我们经常在报告中看到 3 个死线程。我们使用的 windows 服务是使用 Visual Studio 2012 创建的默认 windows 服务,没有用户代码、空白的 OnStart 和 OnStop 方法、没有终结器和除了 VS2012 添加的库引用之外的其他库引用。

以下是我们对死线程的主要关注点: - 这些死线程对于任何 .NET Windows 服务都是正常的吗?- 什么通常会导致死线程?- 死线程会导致内存泄漏吗?- 死线程是否会导致 CPU 未得到充分利用?- 我们应该关心这些死去的头颅吗?

4

0 回答 0