工作學習筆記――GDI泄露檢測利器
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
用.Net寫的地圖編輯器,最近在一個長時間使用的策劃手里頻繁掛掉。定位到原因應該是GDI泄露。但在幾千行代碼里手工尋找泄漏點實在是有些困難,直到在網上找到了這個檢測GDI泄露的工具GDILeaks。它的強大之處,在于可以將程序里當前占用的gdi位圖、dc用圖形格式顯示出來,這樣,泄露點基本上就直接展示在你眼前了。
另外,關于泄露為什么會發生,我還有些疑問。經檢查,泄漏點是這樣的C#代碼
void doSomeThing()
{
Bitmap tmpBmp = new Bitmap(100,100);
return transformBmp(tmpBmp); //這里對tmpBmp放大后存到一張新位圖上返回,并沒有再引用tmpBmp
}
泄露的是tmpBmp。按我對垃圾回收的理解,出了這個函數,tmpBmp的生命期也就結束了,應該可以被回收掉。實際發生的是,如果不加一句tmpBmp.Dispose(),gdi資源會一直增加,直到彈出資源耗盡的警告對話框。
在MSDN上查了一下,Bitmap對gdi資源的釋放是在它的finalize方法里,但是這個方法不一定保證會執行(比如它被別的finalize方法阻塞了)。不知道我這里碰到的,屬不屬于這種情況。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成