2012-03-09 25 views
2

我有一個運行在生產環境中的C#.NET服務。該服務用作客戶端註冊並提出請求的TCP服務器。在查看任務管理器時,它似乎泄漏大約10MB /天。我似乎沒有注意到這些在開發(可能是因爲少得多的流量和客戶端活動)。在四處搜尋時,我已經看到任務管理器可能是嚴重錯誤的,但我不確定這是多麼準確,或者在什麼情況下TM會顯示不正確的信息。針對.NET生產服務中的內存泄漏

要解決這個問題,我需要更密切地監視內存消耗。問題在於泄漏似乎只出現在生產中,其中部署的服務是爲Release版本構建的。另外,由於這是一項無法直接運行的服務,因此VS會附帶一個配置文件/調試程序,但我不確定如何以比TM更精確的方式查明問題。

任何羣體的智慧將不勝感激,謝謝。

編輯:

  • 我添加性能計數器的服務的士兵字節(7MB開出),以及在所有堆CLR MEM(30MB開出)
  • 任務管理器說總內存大約是37MB,所以這似乎是有意義的
  • 第一部分是讓服務去一天,並再次檢查我的計數器。

如果我的私人字節變大,但CLR mem大致是靜態的,這將表明一個非託管泄漏。如果兩者都變大,那麼這是一個管理泄漏。

謝謝你們。

+1

爲什麼不在測試/分期運行發佈版本以查看是否可以重現泄漏?這是第1步。識別泄漏將是第2步(使用內存分析器)。 – Oded 2012-03-09 16:45:44

+0

我已經完成了這項工作。不幸的是,在開發方面,流量的數量要低一個數量級。所以泄漏不太明顯。 – kmarks2 2012-03-09 16:59:12

回答

4

你的首要任務是搞清楚如果該進程正在泄漏內存。你可以用perfmon來測量私人字節數 http://www.goldstarsoftware.com/papers/CapturingVirtualBytesToALogFile.pdf

如果圖形持續上升(比如說半個小時),你就有內存泄漏。然後,您可以使用其他計數器來確定這是不是.NET泄漏(.NET內存),儘管這不太可能。我發現在大多數情況下,有一個正在被調用但未被釋放的COM組件。

如果確實存在內存泄漏(並且這不僅僅是可變內存使用) - 運行一段時間後,進程將因內存不足而關閉。

+1

太棒了。我正在玩perfmon,但沒有取得太大的進展,使其有用。這有很長的路要走。謝謝。 – kmarks2 2012-03-09 17:00:08

+0

我增加了一個專用字節計數器以及一個CLR堆內存計數器。在過去的一個小時裏,私人從7個增加到8MB。 CLR堆似乎在16到20MB之間波動。奇怪的是,它是一個純粹的C#項目。沒有任何類型的顯式編組或COM互操作。我想這些東西可能會在後臺發生(因爲所有的.NET TCP都是WinSock)。 – kmarks2 2012-03-09 20:27:52

2

你需要下面的MemoryProfiler之一來監視它;

http://www.jetbrains.com/profiler/

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

還有其他的選擇,但這些都是非常有能力,你可以與他們個人資料的遠程應用程序的內存(至少JetBrains公司的解決方案處理該)

+1

但是,你會建議對**生產**系統運行這些嗎? – Oded 2012-03-09 16:46:19

+1

爲什麼不。比'內存泄漏'更好的'生產系統' – Zuuum 2012-03-09 16:48:07

2

按照本指南:http://blogs.msdn.com/b/tess/archive/2008/03/25/net-debugging-demos-lab-7-memory-leak.aspx

它越過你所描述的到底是什麼,在生產內存泄漏。如前所述,您必須首先確定它是否使用perfmon和Private Bytes泄漏的非託管代碼或託管代碼。

一般來說,請確保您使用語句包裝它們的網絡對象,以便妥善處置它們。

我經常用於管理內存泄漏的工作流是在測試機器上啓動服務器,用已知數量的連接(例如123,456個連接)啓動服務器。然後進入任務管理器並右鍵點擊進程名並選擇'創建轉儲'來獲取內存快照。使用WinDBG和SOS打開此轉儲並運行命令!dumpheap -stat。查找具有123,456個實例倍數的對象。這些物體是否應該留在記憶中?如果不在這些對象的實例上運行!gcroot,以找出它仍然在內存中的原因。

2
  1. 當它處於泄漏狀態時,使用任務管理器右鍵單擊進程並選擇創建轉儲文件,獲取內存轉儲。您也可以使用ProcDump,它提供了更多選項。

  2. WinDebug或Visual Studio中使用SOS擴展來檢查內存。