我有一個運行在Windows Server 2008上的C#編寫的.NET 4 Windows服務,當使用PerfMon進行監控時,它每小時消耗2500個句柄。 「手柄計數」計數器不斷攀升。如何解決C#Windows服務中的句柄泄漏問題
當我使用ProcExp選擇「顯示未命名的句柄和映射」選項來查看句柄時,會列出數千個「事件」和「信號量」句柄。大多數似乎未命名。我查看了源代碼,並沒有明確使用AutoResetEvent或ManualResetEvent。
私人字節計數器攀升和下降。我沒有看到這個過程超過幾個小時,但會讓它在一夜之間受到監控。
該服務在遠程服務器上運行,因此我無法直接附加調試程序,並且可能必須轉儲該進程並使用WinDBG或類似工具進行分析。
是否可以找到其中一個手柄並找出它指向的內容和/或什麼可能「擁有」它?如果是這樣如何?
回覆評論時,以下是對服務內容的總結。
- 主機一些WCF服務
- 主機Quartz.NET調度的實例
- 主機工作項隊列(石英工作推進工作項目到一個隊列,而不是做長期運行的工作本身)
- 主機工作項目執行人(工作項離隊上的定時器,並從石英執行遠)
- 主機自定義緩存管理器(它做了很多工作ADO.NET的)
聽起來像一個艱難的。你的服務是做什麼的?人們會認爲它使用了一些在幕後做一些非管理性的API。也許如果你提到你使用的是哪些庫,那會慢慢記住某人的記憶。否則,恐怕你會得到像「確保你打電話給.Dispose()」這樣的答案。 – 2012-01-10 04:30:30
您的服務器是否使用非託管代碼,併發集合,長輪詢? – adontz 2012-01-10 05:08:46
感謝您的意見到目前爲止。查看更新的說明。 – IanT8 2012-01-10 18:33:00