我正在Compact .NET Framework v3.5下的Windows CE設備上使用基於事務的系統。我們發現,隨着越來越多的交易被執行,越來越少的內存可用。顯然是某種內存泄漏。在.NET Compact Framework中尋找內存泄漏(WinCE 5)
每次交易之後,我們會讀取兩條記憶讀數;一個來自OS(一個PInvoke調用),一個來自垃圾收集器。我們發現操作系統讀數正在增加內存使用量,而來自GC的讀數保持相對穩定(大約1MB差異+ - )。
該應用程序利用Microsoft Synchronization Services將信息存儲在幾個本地數據庫(SQL Server Compact v3.5)上,並將它們與遠程服務器進行同步。
如果這是Windows XP,我只需使用WinDbg連接到可執行文件,並分析堆以查看是否創建了永遠不會獲取GC的對象。但是,我甚至不知道託管堆是否是問題。
所以這個問題是兩個部分:
1)什麼是託管應用程序以這種方式泄漏內存(DataAdapters,流的罪魁,等)?
2)什麼調試工具/技術將幫助我追蹤確切的問題?
我知道這還不是很多,但現階段我沒有太多的信息。
謝謝!
發現這個問題,並感謝您專注於SQL Compact,正如您所建議的。我們使用的強類型TableAdapter類在實例化時創建一個SqlCeConnection對象。這些連接永遠不會被我們關閉,也不會被自動生成的代碼關閉。 根據MSDN: 如果SqlCeConnection超出範圍,它不會關閉。您必須通過調用Close或Dispose來顯式關閉連接。 當我們單一實例化這些適配器的應用程序的生命週期時,問題大大減少了。還是有一些泄漏,但它可能是其他適配器 – CAP 2010-11-18 15:54:24
......我們還沒有保護。 – CAP 2010-11-18 16:00:17
是的,這仍然是爲什麼我們從不使用自動生成的強類型類的原因。主要原因是他們資源太慢。 – ctacke 2010-11-18 16:27:50