Memory leaks SWT使用操作系统资源,但限制是什么,如何分析?

Memory leaks SWT使用操作系统资源,但限制是什么,如何分析?,memory-leaks,java-8,swt,rcp,Memory Leaks,Java 8,Swt,Rcp,SWT使用操作系统资源,因此SWT内存消耗不依赖于堆(xms xms)和非堆(元空间)。如果我在那一点上错了,请纠正我 SWT组件使用的资源(颜色、字体、图像等)是否有任何限制 如何知道是否达到了限制,以及如何分析该限制 如果达到此限制,Java RCP应用程序可能会在没有JavaOutOfMemoryError的情况下崩溃(只是一个pid文件) 注意:我使用Sleak来确定应用程序当前使用的图形对象的数量如上所述,特定于Windows的GDI句柄的最大数量会影响(SWT)进程可以分配多少资

SWT使用操作系统资源,因此SWT内存消耗不依赖于堆(xms xms)和非堆(元空间)。如果我在那一点上错了,请纠正我

  • SWT组件使用的资源(颜色、字体、图像等)是否有任何限制

  • 如何知道是否达到了限制,以及如何分析该限制

  • 如果达到此限制,Java RCP应用程序可能会在没有Java
    OutOfMemoryError
    的情况下崩溃(只是一个pid文件)

注意:我使用Sleak来确定应用程序当前使用的图形对象的数量

如上所述,特定于Windows的GDI句柄的最大数量会影响(SWT)进程可以分配多少资源。有关更多详细信息,请参阅。在其他平台上,限制可能不同

正如您已经发现的,是监视SWT应用程序的图形资源使用情况的正确工具

如果应用程序没有句柄,它不仅仅是“崩溃”。当达到限制并尝试创建新资源时,将引发
SWTError

通常,可以像处理任何其他异常一样处理该异常,并且在释放未使用的资源后,可以创建新的资源

IIRC,RCP应用程序的默认异常处理程序将打开一个对话框,要求用户在这种情况下优雅地退出应用程序

然而,SWT应用程序中的句柄不足通常表明您创建/使用小部件的策略是错误的


减少资源数量的一个常见策略是使用惰性/虚拟
树和
表,并且仅在小部件可见时创建它们,在不再需要时处理它们。例如,在
TabFolder
中,除非选中
TabItem
,否则您将推迟填充该项。

AFAIK每个应用程序的Windows上的限制为GDI 65536个句柄。如果超过该值,应用程序将崩溃,出现
SWTError:No-more handles
。也可能有用。