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:如果是很少使用、则在是使用完毕后,调用它的销毁函数,


原创粉丝点击