2011-10-12 55 views
2

的極端發展我正在表現出一些非常奇特的問題的應用程序。它運行在2.5小時左右,然後突然非託管內存開始增長,並迅速增長。在大約半個小時左右的時間裏,應用程序崩潰。.NET應用程序的經驗突然非託管內存

的應用程序未使用任何非託管的DLL。它正在與外部應用程序通信。它使用套接字(通過Stream使用)並通過WCF流​​進行讀取。

我與螞蟻異形它。非託管內存利用率的突然變化非常驚人;它永遠保持完全平坦,然後突然開始上升,並以穩定的速度繼續這樣做,直到應用程序失敗。託管內存中沒有任何內容似乎不合適。

既然我沒有故意使用非託管代碼,這是很難牽制在泄漏的來源。螞蟻沒有幫助。當它從一開始就不是一個穩定的增長時,很難清除代碼中的問題(應用程序一直處於空閒狀態,儘管它每秒通過具有非常少量數據的套接字來ping服務器一次)。

再次重申,應用程序和服務器都在此期間,兩個空閒;這是在獨立的測試系統上運行(包括服務器和客戶端)。客戶是泄漏的客戶。

+1

這可能有助於http://stackoverflow.com/questions/1180649/how-to-find-dispose-and-memory-issues-c – hatchet

+0

你是否能夠縮小到一個特定的頁面或類? –

+0

出於好奇,它生長的速度有多快?它的增長速度大約是每秒*非常少量的數據*的速度嗎? –

回答

3

您可能需要使用DebugDiag資料監視內存泄漏和提供資料,被分配什麼,有多少,以及什麼叫堆棧。總之:

進程已經啓動(或重新啓動)之後不久,做到以下幾點:

  1. 打開DebugDiag資料。
  2. 取消嚮導。
  3. 轉到「進程」選項卡。
  4. 右鍵單擊所需的過程。
  5. 選擇顯示器用於泄漏。
  6. 單擊確定。

處理後已經運行了一段時間,內存問題是顯而易見的:

  1. 轉到DebugDiag資料
  2. 如果不是仍然打開,取消了嚮導。
  3. 轉到「進程」選項卡。
  4. 右鍵單擊與部件#1相同的進程。
  5. 選擇Create Full Userdump。
  6. 記下轉儲的位置。

另外,如果進程重新啓動的內存轉儲被捕獲之前,泄漏監測將被重新啓用。

一旦你的轉儲:

  1. 轉到DebugDiag資料。
  2. 轉到「高級分析」選項卡。
  3. 向上選擇「MemoryAnalysis.asp」腳本。
  4. 單擊底部的「添加數據文件」並選擇先前創建的轉儲。
  5. 單擊「開始分析」並查看結果。

一旦你有了這些信息,你應該能夠確定內存分配的來源,並希望能夠解決問題的原因。

您可以從以下資源找到更多的信息:

0

我們終於發現了問題。事實證明,我們之間有一個套接字連接,在空閒階段,我們會發送一個KeepAlive數據包,以防止偵聽器自動斷開連接。但是,在閒置一段時間後,通過WCF的一些特殊超時,套接字被關閉了服務器端。

所以基本上每次DispatchTimer被觸發時,keep-alive數據包都會被寫入套接字,但顯然它會被阻塞。這不會阻止下一個DispatchTimer執行完全相同的操作。雖然它看起來像是更大的東西,但這些小包快速建立起來並且吃掉了所有非託管內存,我推測這個套接字的緩衝區(我相信我們使用NetworkStream進行連接)。隨着邏輯的幾次轉變,問題就消失了。

感謝所有的輸入,但是非常感謝!

相關問題