- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个报告大量逻辑线程的服务。来自 PerfMon:
.NET CLR LocksAndThreads -> # of current logical threads: 663
.NET CLR LocksAndThreads -> # of current physical threads: 659
Process -> Thread Count: 15
这太高了,所以我捕获了一个内存转储(通过 sysinternals procdump.exe)并从 Visual Studio(混合调试)打开它。加载完所有内容后,我查看了线程窗口,它只显示了 15 个操作系统线程,而不是 .net 物理线程或 .net 逻辑线程。该服务本身是一个 Windows 服务,承载 4 个 WCF 服务 (System.ServiceModel.ServiceHost)。
我如何找出这些线程是什么,以便我可以修复代码并摆脱它们?如何让 visual studio 识别和显示逻辑线程?是 Visual Studio 的问题,还是转储本身的问题?
最佳答案
首先,您需要获取内存转储。有多种方法可以做到这一点。我找到的最简单的一个是 procdump.exe,它是 SysInternals 的一部分,随文档一起提供 here .
接下来,您需要下载并安装 WinDbg 并让 SOS 正常工作(SOS 是让您查看 .net 托管进程的模块)。有关设置的更多信息可用 here .如果您从服务器获取转储(如我的情况),那么 .net 版本可能会略有偏差,并且 SOS 将无法正确处理转储文件。如果发生这种情况,您需要根据 this 将一些相关文件从源 .net 版本复制到您的 windbg 安装中。评论。
一旦一切都设置好并加载了转储,运行命令:
!threads
这应该为您提供 .net 逻辑线程列表。还要注意的是,在线程列表之前,它会给你一个总结。对于这个问题的重要性,DeadThread 非常高(600+)。这表明线程已经完成,但是他们持有的内存(堆栈)无法释放。
在我的具体案例中,我发现挂起的线程是来自 WCF 线程池的线程,它们无法进行 GC,因为其他线程持有对它的引用。当其他线程不再需要父线程时,我将其更改为清空父线程,这样它就可以正确地进行 GC。
关于c# - 使用 Visual Studio 调试器查看/诊断内存转储中的逻辑 .NET 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314002/
我正在为我的应用程序使用 Tank-Auth。我唯一的问题是激活和重置帐户密码。 用于登录、注册、注销;我对这些代码没有问题; $route['login'] = "/auth/login"; $ro
我是一名优秀的程序员,十分优秀!