2009-10-01 120 views
2

我們有一個.NET應用程序在生產中運行了一年多。這是一個後臺服務,它的寫法是,如果因任何原因崩潰,它將自動重新啓動。直到最近它並沒有給我們帶來任何頭痛,儘管它每天都要承受沉重的負擔,但現在每一次在藍月亮裏它都會因爲OutOfMemorey異常而崩潰。重新啓動之後,它會檢測到它發生崩潰並執行任何它應該做的事情,因此客戶不在意,但我想了解導致崩潰的原因。.NET OutOfMemory異常

因此,問題:有沒有辦法在沒有重新部署應用程序的情況下檢查崩潰? 我想要做的是產生一個崩潰轉儲或smend,然後手動通過轉儲,試圖找出什麼對象吃我所有的記憶。你會建議我用什麼工具來使這個任務更容易?

回答

4

您可能會發現從MSDN下面的文章有所幫助:

生產調試的.NET Framework應用程序

http://msdn.microsoft.com/en-us/library/ms954591.aspx

儘管詳細討論了ASP.NET應用程序,在對服務或獨立應用程序執行內存分析時,某些技術描述同樣有效。

您可能還想使用Perfmon連接到流程,看看您是否在Gen 1或Gen 2堆中獲得大量增長 - 這通常表示存在太多垃圾收集和創建的對象內存壓力在你的應用程序。您可能還需要查看「專用字節」度量標準的大小 - 此處的增長表示大量非託管內存正在爲您的進程分配。

Perfmon分析很有用,因爲它可以顯示內存使用超時,並幫助查明特定類型的處理或事務是否導致內存消耗。

如果您可以在測試環境中重現問題,那麼可以在需要挖掘內存轉儲的一小部分時間內幫助查明這些問題。

有一些工具可以在後臺運行(如DebugDiag),可以定期進行cpaturing內存轉儲,或者發生某些事件時。你可以在這裏讀到他們:

http://blogs.msdn.com/sukeshak/pages/ddintro.aspx

http://blogs.msdn.com/tess/archive/2009/01/23/net-hang-analyzing-debug-diag-output.aspx

+0

還有由名EQATEC另一探查。它也很好。 http://www.eqatec.com/tools/profiler – RCIX 2009-10-01 19:14:47

+0

+1爲鏈接 – Rodrigo 2009-10-01 19:23:07

+0

我無法隨意複製這個東西 - 正如我所提到的,它只發生很少。作爲另一種選擇,我希望進行分析後驗。我只是不知道我怎麼能得到一個轉儲和用什麼來分析它。 – mfeingold 2009-10-01 20:14:19