[英]Targetting memory leak in a .NET production service
我有一個在生產中運行的C#.NET服務。 該服務用作客戶端注冊和發出請求的TCP服務器。 在查看任務管理器時,它似乎泄漏了大約10MB /天。 我似乎沒有注意到這些(也許是因為流量和客戶活動少得多)。 在搜索時我已經讀到任務管理器可能嚴重錯誤,但我不確定這是多么准確或在什么情況下TM會顯示不正確的信息。
要解決這個問題,我需要更密切地監控內存消耗。 問題是泄漏似乎只出現在生產中,其中部署的服務是為Release構建的。 此外,因為它是一個無法直接運行的服務,帶有附加的分析器/調試,我不知道如何用比TM更精確的東西來最好地查明問題。
任何群體智慧都會非常感激,謝謝。
編輯:
如果我的私有字節變得很大但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來查找它仍然在內存中的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.