2012-01-10 66 views
5

我有一個運行在Windows Server 2008上的C#編寫的.NET 4 Windows服務,當使用PerfMon進行監控時,它每小時消耗2500個句柄。 「手柄計數」計數器不斷攀升。如何解決C#Windows服務中的句柄泄漏問題

當我使用ProcExp選擇「顯示未命名的句柄和映射」選項來查看句柄時,會列出數千個「事件」和「信號量」句柄。大多數似乎未命名。我查看了源代碼,並沒有明確使用AutoResetEvent或ManualResetEvent。

私人字節計數器攀升和下降。我沒有看到這個過程超過幾個小時,但會讓它在一夜之間受到監控。

該服務在遠程服務器上運行,因此我無法直接附加調試程序,並且可能必須轉儲該進程並使用WinDBG或類似工具進行分析。

是否可以找到其中一個手柄並找出它指向的內容和/或什麼可能「擁有」它?如果是這樣如何?

回覆評論時,以下是對服務內容的總結。

  • 主機一些WCF服務
  • 主機Quartz.NET調度的實例
  • 主機工作項隊列(石英工作推進工作項目到一個隊列,而不是做長期運行的工作本身)
  • 主機工作項目執行人(工作項離隊上的定時器,並從石英執行遠)
  • 主機自定義緩存管理器(它做了很多工作ADO.NET的)
+0

聽起來像一個艱難的。你的服務是做什麼的?人們會認爲它使用了一些在幕後做一些非管理性的API。也許如果你提到你使用的是哪些庫,那會慢慢記住某人的記憶。否則,恐怕你會得到像「確保你打電話給.Dispose()」這樣的答案。 – 2012-01-10 04:30:30

+0

您的服務器是否使用非託管代碼,併發集合,長輪詢? – adontz 2012-01-10 05:08:46

+0

感謝您的意見到目前爲止。查看更新的說明。 – IanT8 2012-01-10 18:33:00

回答

1

故障排除的基本概念是隔離。隔離的過程和狀態。

您需要做的第一件事是在您控制的環境中重現問題。嘗試在你的開發機器上進行設置,如果在開發環境中設置的服務時間太長,可以考慮將它們嘲笑一下。

一旦你在控制環境中,你可以通過嘲笑或剔除它來開始削減正在執行的代碼。