2012-03-23 114 views
3

我有一個應用程序,它做了一堆文本解析。每次通過後,它會將一些信息吐出到數據庫中,並清除所有內部狀態。。網絡越來越多內存問題

我的問題是在Windows任務管理器/資源監視器分配的memeory不斷增長和增長。我已經使用.Net Mem Profiler做了一些配置文件,它看起來應該會下降。下面是來自分析器的屏幕截圖:

enter image description here

但在任務經理每次使用後通過內存私人工作集增加。我希望內存隨着它的使用而增長,然後在每次傳遞之後回到正常水平,這樣我就可以繼續運行這個東西。

有什麼建議尋找什麼或任何想法是什麼原因造成的?

+2

您是否遇到內存不足的問題?或者這只是先發制人的擔憂? :) .net喜歡堅持記憶一段時間......我在這裏沒有看到任何異常。除非它真的引起問題,否則我不會太擔心。 – cHao 2012-03-23 23:40:33

+0

我有大量的導入作業,它們在聚集它並將其放入SQL之前使用一些內存。在做了其中的一些之後,它最終會吃掉系統中的所有內存並停止工作。 – 2012-03-23 23:55:21

+0

你能發佈跟蹤顯示每一代的堆利用率和堆中的實例嗎?如果您使用小樣本數據進行測試並比較每次傳遞後的內存快照,將會更容易。 – 2012-03-24 06:53:31

回答

1

這力量.NET來收集所有未使用的對象從內存中,因此回收一些吧:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
+2

但是它不需要釋放內存到操作系統,所以私有字節可能不受影響。請記住,CLR充當託管應用程序的內存管理器。 – 2012-03-23 23:48:48

3

任務經理是不是你的應用程序實際上使用內存的準確表示。它更多地表示了爲應用程序分配或計劃了多少內存窗口 - 如果您的應用程序需要更多,Windows可以擴展此數量,但是如果您的應用程序需要更少,Windows可能不會重新分配此內存,直到另一個應用程序實際需要它..

我想你上面的是一個相當準確的表示你的應用程序實際上在做什麼(即它沒有泄漏)。

+0

有沒有辦法通過.Net或編譯標誌告訴Windows爲應用程序釋放內存。當它運行時,我不介意使用其實際需要的一些內存。但是,一旦處理完一項工作,從Windows獲取內存將會很好。 – 2012-03-23 23:56:34

3

有幾件事情來檢查有:

  1. 事件處理保持對象還活着,以確保如果該簽約了事件的對象超出範圍的對象之前發佈它從退訂事件事件以防止發佈對象保留對其的引用。
  2. 確保您在實現IDisposable的任何對象上調用dispose。一般來說,實現IDisposable的對象包含需要特別整理的資源。
  3. 如果您引用了任何com對象,請確保您正確釋放它們。

您不應該在生產代碼中調用GC.Collect()

+2

+1永遠不會調用GC.Collect() – 2012-03-24 00:07:55

0

如果您確實有內存泄漏,您可以使用SOS debugging extension來嘗試找到它。 This article也是一個很好的例子,並且更完整一點,那麼我的答案將包括什麼。

你可以在VS或WinDbg中使用它,唯一的區別是你如何加載DLL。對於Visual Studio,首先在項目屬性的調試選項卡中啓用非託管調試。當需要加載時,請在Immediate Window中使用.load SOS.dll。對於WinDbg,打開可執行文件或附加到進程,並加載它,使用.NET 4的.loadby sos clr或使用2或3.5的.loadby sos mscorwks

讓應用程序運行一段時間後,暫停它(全部中斷)。現在你可以加載SOS。成功後,輸入!dumpheap -stat。這將列出每個類正在使用多少內存。如果這還不足以發現泄漏,我鏈接的另一篇文章將更深入地探討如何定位內存泄漏。

+0

其實,我想我讀錯了圖,所以你可能沒有一個(除非我再讀錯了D :)。我想我可以把它放在這裏,以防萬一它適合其他人的記憶問題。 – Timiz0r 2012-03-24 00:30:15

0

解決此問題的一種方法是將您的工作分解爲單獨的可執行程序。一旦程序完成其工作並結束,所有的內存將被系統回收。