最近出了几个奇怪的问题,打开时间的GUI会莫名的抛Exception,报“no more SWT handle”. 句柄(Handle)资源以前做Win32/MFC接触的比较多,转到Java/SWT之后就很少接触到。
出错原因很清楚,Resource不够了!SWT和Swing的实现方法不同,它还是使用了Native的资源,所以句柄资源不会被GC回收。Eclipse提供了一个叫Sleak的工具来检查Leak的情况。情况果然非常严重,主要原因是我们生成了大量的Image。不仅仅是Image,在使用Font,Color,GC的时候也要非常注意,遵循“谁生成谁销毁”的原因。
在RCP中加入Sleak的方法是–Application.java的start方法中加入:
1 2 3 4 5 6 7 8 9 10 |
// 打开Debug选项 Policy.DEBUG_SWT_DEBUG = true; Policy.DEBUG_SWT_GRAPHICS = true; // 再create Display Display display = PlatformUI.createDisplay(); // 植入Sleak Sleak sleak = new Sleak(); sleak.open(); |
之后,Sleak的界面会随着RCP启动。