非託管資源記憶體洩露調測

2021-08-21 02:54:37 字數 862 閱讀 8663

非託管資源記憶體洩露調測

專案中某一識別引擎在併發720vuser持續壓測2d後掛起,

控制台視窗報錯「system.outofmemoryexception.exception」

原因分析:

vsserver發生了隱式記憶體洩露且最大可能是非託管資源記憶體洩露。

驗證方法:

(1)使用clrprofiler記憶體洩露除錯工具進行調測,發現乙個問題:傳入同樣的引數,呼叫語音識別介面(speechserver.aspx),如此嘗試10次,發現每次呼叫成功後,開啟控制代碼數為318,銷毀或已關閉的控制代碼數為25,存活或未關閉的控制代碼數為293,即未關閉的控制代碼佔總控制代碼數92%,如下圖所示:

初步懷疑記憶體洩露是由於控制代碼洩露導致的。為了驗證該問題,測試策略如下:

模擬併發40使用者持續壓測,分別監控vsserver.exe的執行緒數和控制代碼數及其記憶體消耗,測試結果如下圖所示:

從圖上看,執行緒數未增加,基本呈直線型。控制代碼數一開始直線上公升,然後由於控制代碼的銷毀與開啟呈鋸齒型,然後壓測結束後控制代碼數曲線沒有下降趨勢,可以說明vsserver存在控制代碼洩露。

但從.net應用程式記憶體洩露型別角度講,該記憶體洩露表現為非託管記憶體發生洩漏,即使用完非託管資源時未做顯式的資源釋放,如下圖所示:

所以有兩點是值得肯定的:

(1)vsserver洩露是由於控制代碼洩露導致

(2)控制代碼洩露表現為非託管資源記憶體洩露

解決方案:

為此在vsserver執行中使用clrprofiler監控,同樣做了10次統計,每次表現出存在如圖所示函式呼叫過程中有未關閉的控制代碼,其中writeline()函式結束後未關閉的控制代碼數占90%以上,修改writeline()函式中檔案流未徹底關閉問題。

非託管資源記憶體洩露調測

託管資源和非託管資源

託管資源 net可以自動進行 的資源,主要是指託管堆上分配的記憶體資源。託管資源的 工作不需要人工干預的,有.net執行庫在合適時呼叫垃圾 器進行 非託管資源 是.net不知道如何 的資源,最常見的一類非託管資源是包裝作業系統資源的物件,如檔案,視窗,網路連線,資料庫連線,畫刷,圖示等。這類資源,垃...

C 託管資源和非託管資源

託管資源指的是.net可以自動進行 的資源,主要是指託管堆上分配的記憶體資源。託管資源的 工作是不需要人工干預的,有.net執行庫在合適呼叫垃圾 器進行 非託管資源指的是.net不知道如何 的資源,最常見的一類非託管資源是包裝作業系統資源的物件,例如檔案,視窗,網路連線,資料庫連線,畫刷,圖示等。這...

C 託管資源與非託管資源

在.net 程式設計環境中,系統的資源分為託管資源和非託管資源。託管資源 net平台中,clr為程式設計師提供了一種很好的記憶體管理機制,使得程式設計師在編寫 時不要顯式的去釋放自己使用的記憶體資源 這些在先前c和c 中是需要程式設計師自己去顯式的釋放的 這種管理機制稱為gc garbage col...