簡體   English   中英

針對.NET生產服務中的內存泄漏

[英]Targetting memory leak in a .NET production service

我有一個在生產中運行的C#.NET服務。 該服務用作客戶端注冊和發出請求的TCP服務器。 在查看任務管理器時,它似乎泄漏了大約10MB /天。 我似乎沒有注意到這些(也許是因為流量和客戶活動少得多)。 在搜索時我已經讀到任務管理器可能嚴重錯誤,但我不確定這是多么准確或在什么情況下TM會顯示不正確的信息。

要解決這個問題,我需要更密切地監控內存消耗。 問題是泄漏似乎只出現在生產中,其中部署的服務是為Release構建的。 此外,因為它是一個無法直接運行的服務,帶有附加的分析器/調試,我不知道如何用比TM更精確的東西來最好地查明問題。

任何群體智慧都會非常感激,謝謝。

編輯:

  • 我已經為服務的私有字節添加了perfmon計數器(7MB開始)以及所有堆中的CLR mem(30MB開始)
  • 任務經理說總內存大約為37MB,所以這似乎是有道理的
  • 第一部分是讓服務去一天,然后再次檢查我的櫃台。

如果我的私有字節變得很大但CLR內存大致是靜態的,這將表明一個非托管泄漏。 如果兩者都變得巨大,那么它就是一個有管理的泄漏。

多謝你們。

您的第一個任務是確定進程是否泄漏內存。 您可以使用perfmon測量私有字節http://www.goldstarsoftware.com/papers/CapturingVirtualBytesToALogFile.pdf

如果圖表一直在上升(例如半小時),則會出現內存泄漏。 然后,您可以使用其他計數器來確定這是否是.NET泄漏(.NET內存),盡管這不太可能。 我發現在大多數情況下,有一個COM組件正在被調用但未被釋放。

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

您需要以下MemoryProfilers之一來監控它;

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

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

還有其他選擇,但這些選項非常強大,您可以使用它們分析遠程應用程序的內存(至少JetBrains的解決方案處理它)

請遵循以下指南: http//blogs.msdn.com/b/tess/archive/2008/03/25/net-debugging-demos-lab-7-memory-leak.aspx

它完全超出了你所描述的內容,即生產中的內存泄漏。 如前所述,您必須首先確定它是使用perfmon和Private Bytes泄漏的非托管代碼還是托管代碼。

一般來說,確保使用語句包裝它們的網絡對象,以便正確處理它們。

我經常用於托管內存泄漏的工作流程是在測試計算機上啟動服務器,使用已知數量的連接(例如123,456個連接)命中它。 然后通過轉到任務管理器並右鍵單擊進程名稱並選擇“create dump”來獲取內存快照。 使用WinDBG和SOS打開此轉儲並運行命令!dumpheap -stat。 查找具有123,456個實例的多個對象。 這些物體是否仍然在記憶中? 如果沒有在這些對象的實例上運行!gcroot來查找它仍然在內存中的原因。

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

  2. WinDebug或Visual Studio中使用SOS Extensions檢查內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM