SWT 句柄泄漏分析报告
来源:互联网 发布:中国温室气体排放数据 编辑:程序博客网 时间:2024/06/16 05:19
一:什么叫句柄
WINDOWS下有很多种句柄,如文件句柄,进程句柄,窗口句柄等。
句柄是内核用来标识内核对象或其他对象的一个数值。句柄代表的
对象所占用的内存是由内核分配的,每种句柄都有相应的释放方法,
如果不释放句柄,内核就无法回收内存。
二:SWT简介
SWT本质上都是一套依赖于操作系统具体实现的GUI库, 每一个swt的窗口都对应一个本地窗口,在获得窗口句柄之后,就可以和用其他的语言(比如C++)实现的 GUI应用程序进行一些互操作。比如我们可以调用一些SetParene()之类的方法把一个本地的窗口嵌入到一个SWT的窗口里来,反之亦然。这样就提供了一个创建更丰富美观的,可扩充性更强的GUI应用程序的手段
三:SWT句柄泄漏的原因:
我们以图片image(SWT.BITMAP)创建建和释放为例解释引入句柄泄漏的原因,
图元的创建过程,通过本地调用创建图片,返回图片的句柄,(已忽略详细的实现过程)
同样我们查看图片的销毁处理(已忽略详细的实现过程)
本地方法
OS.CreateCompatibleBitmap (int hdc, intnWidth, int nHeight);
创建图片后的返回值就是image的句柄
#ifndef NO_CreateCompatibleBitmap
JNIEXPORT jint JNICALLOS_NATIVE(CreateCompatibleBitmap)
(JNIEnv*env, jclass that, jint arg0, jint arg1, jint arg2)
{
jintrc = 0;
OS_NATIVE_ENTER(env,that, CreateCompatibleBitmap_FUNC);
rc =(jint)CreateCompatibleBitmap((HDC)arg0, arg1, arg2);
OS_NATIVE_EXIT(env,that, CreateCompatibleBitmap_FUNC);
returnrc;
}
#endif
同样我们查看图片的销毁处理(已忽略详细的实现过程)
Image的dipose方法中通过本地调用销毁图片的句柄
OS.DeleteObject(handle);
os.c中销毁句柄的实现
#ifndefNO_DeleteObject
JNIEXPORTjboolean JNICALL OS_NATIVE(DeleteObject)
(JNIEnv *env, jclass that, jint arg0)
{
jboolean rc = 0;
OS_NATIVE_ENTER(env, that,DeleteObject_FUNC);
rc =(jboolean)DeleteObject((HGDIOBJ)arg0);
OS_NATIVE_EXIT(env, that,DeleteObject_FUNC);
return rc;
}
#endif
由此可见我们必须要显示的销毁自己创建的图片
四:SWT句柄泄漏的实体类:
图形设备接口
1:继承swt(Resource)都是需要手动释放资源的(dispose)
Font,Color,Image,Cursor,GC,Path,Pattren,Region,TransForm,TextLayOut(除外)
1>:单独的创建,搜索自己代码的构造函数,
2>:系统API的创建,查找系统的创建工厂,跟踪Font的来源
Font.win32_new (display, hFont)
2:所有继承Control的控件也是存在窗口句柄,不过在控件关闭的时候,会自动清除窗口句柄, 销毁方法destroyWidget() 这些不用显示销毁
3:继承Device的资源需要释放,Display,Printer
五:常见方法:
1:参考jface的解决方式:SWTResourceUtil (缓冲池的方式)
我们IDE已经采用类似的方式common ui插件
注意:如果保存了对池中数据的引用,不要单独的销毁资源,缓冲池的数据自己有销毁的处理
2:如果是很少使用、则在是使用完毕后,调用它的销毁函数,
- SWT 句柄泄漏分析报告
- system调用导致子进程socket句柄泄漏问题分析
- CreateToolhelp32Snapshot句柄泄漏(内存泄漏)
- 程序句柄泄漏
- 关于句柄泄漏
- 谈”句柄泄漏“
- 句柄泄漏调试经验
- CMFCMenuBar::CreateFromMenu 句柄泄漏
- 谈”句柄泄漏”
- 检查调试句柄泄漏
- 句柄泄漏调试经验
- windbg调试句柄泄漏
- 借助 windbg 调试 句柄泄漏
- 借助 windbg 调试 句柄泄漏
- 借助 windbg 调试 句柄泄漏
- gdi 句柄泄漏之坑
- 随想录(句柄泄漏)
- tcp socket文件句柄泄漏
- top命令复习
- MyEclipse输入代码打点没有提示的解决办法
- poj 1503 Integer Inquiry lightbluem
- win mobile 5播放mp3音乐的方法(3)--pcm码流播放篇
- 重载(overloading)与重写(overriding)
- SWT 句柄泄漏分析报告
- Struts2_三种传参数方法
- sybase iq知识
- 最全的Windows7 服务优化、详解。
- 关于思考
- DNS中的SPF记录
- SSH框架搭建
- flex中datagrid控件的itemclick事件
- 读代码是eclipse中快捷键