网站首页 > 物联资讯 > 技术分享

工作学习笔记――GDI泄露检测利器

2016-09-28 00:00:00 广州睿丰德信息科技有限公司 阅读
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接

用.Net写的地图编辑器,最近在一个长时间使用的策划手里频繁挂掉。定位到原因应该是GDI泄露。但在几千行代码里手工寻找泄漏点实在是有些困难,直到在网上找到了这个检测GDI泄露的工具GDILeaks。它的强大之处,在于可以将程序里当前占用的gdi位图、dc用图形格式显示出来,这样,泄露点基本上就直接展示在你眼前了。

RFID,RFID仓储管理,RFID资产管理,RFID系统,RFID设备管理RFID资产管理,RFID仓库管理,RFID珠宝,RFID生产线,RFID手持机,RFID读写器,广州睿丰德


另外,关于泄露为什么会发生,我还有些疑问。经检查,泄漏点是这样的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中间件 条码系统中间层 物联网软件集成