我在IIS中托管了一个WCF应用程序(用C#/.Net 4
编写)。随着时间的推移,该过程的Handle Count以或多或少的线性方式增加(在该过程回收之前增加高达30,000)。根据SysInternals Process Explorer,进程拥有的大部分句柄都是Thread
类型。但是,根据性能监视器,线程的数量或多或少保持不变(大约40)。
显然,我做错了什么并且正在泄漏Thread Handles
。但是,我不清楚在这种情况下Thread Handle
究竟是什么。我会假设它是一个线程的句柄,但由于线程数保持一致,我不知道句柄数是如何增加的。并且,我想不出任何方法来保持线程的句柄,而线程本身就会消失。此外,我没有明确地创建新线程(我在地方使用ThreadPool
。)
答案 0 :(得分:1)
可以有终止线程的句柄。所以线程被创建,终止,但句柄仍然存在。
启动Process Monitor(procmon.exe)并将其设置为侦听“进程和线程活动”(禁用文件,注册表和网络)。通过双击线程创建事件并查看堆栈来确定谁在创建线程。
那应该回答谁在创建线程的问题。他负责关闭手柄。
答案 1 :(得分:0)
当
CreateThread
或CreateRemoteThread
函数创建新线程时,将返回该线程的句柄。
因此,如果你有这么多句柄,你的应用程序会不断产生新的线程。另一方面,性能监视器中接近恒定数量的线程表示创建线程代替可回收的线程。
ThreadPool课程文档:
从.NET Framework 4开始,线程池创建并销毁工作线程以优化吞吐量,其定义为每单位时间完成的任务数。线程太少可能无法充分利用可用资源,而太多线程可能会增加资源争用。
所以我认为你的应用程序行为是因为ThreadPool
。