是Java';s Swing真的是一个;记忆猪;?

是Java';s Swing真的是一个;记忆猪;?,java,swing,user-interface,memory-management,Java,Swing,User Interface,Memory Management,我经常听说Java的Swing工具包被认为是“内存猪”(例如) 这是 A由于Swing的架构 BJava内存管理的固有特性;或 C一个毫无根据的说法,其原因是缺乏对内存分配工作原理的理解(例如,仅仅因为任务管理器说某个应用程序已分配了x MB,实际上并不意味着它正在使用所有内存) 与类似的GUI工具包(不一定是Java)相比,我试图找到一个关于Swing真正内存需求的具体、客观的分析。我经常用“膨胀”一词来形容Swing,意思是略有不同: Swing将其所需的一切捆绑在自己的包中,而不是使用

我经常听说Java的Swing工具包被认为是“内存猪”(例如)

这是

  • A由于Swing的架构

  • BJava内存管理的固有特性;或

  • C一个毫无根据的说法,其原因是缺乏对内存分配工作原理的理解(例如,仅仅因为任务管理器说某个应用程序已分配了x MB,实际上并不意味着它正在使用所有内存)

与类似的GUI工具包(不一定是Java)相比,我试图找到一个关于Swing真正内存需求的具体、客观的分析。

我经常用“膨胀”一词来形容Swing,意思是略有不同:

Swing将其所需的一切捆绑在自己的包中,而不是使用已经提供的东西


这是什么意思?这意味着您在Swing中使用/看到的任何内容都是由Swing绘制和处理的。相比之下,SWT实际上使用的是操作系统的windows,因此它自然具有更少的内存使用量和更少的独立工作。Swing中的“窗口”并不是真正的“窗口”,它们只是看起来像窗口。相比之下,SWT使用“真正的”窗口,让操作系统进行大量管理。

请参阅附件测试,在许多情况下,它都是一个平局:

结论 很难给出SWT的经验法则 表现优于Swing,反之亦然。在某些环境(如Windows)中, SWT是赢家。在其他系统(Linux、VMware托管Windows)中,Swing和 它的重画优化显著优于SWT。差异 绩效是显著的:通常情况下,因子为2或更多 两个方向都有

Swing的移动能力有多频繁值得怀疑 抑制连续重画是有效的。很可能在 实践这不是经常发生的,因为重复的更新请求 在短时间内可能不常见。在这种情况下 Swing文本字段(sync)测试应考虑更大的灵活性 可信度高于Swing文本字段测试,因为 更接近资源使用情况

初始期望 在执行该基准测试之前,我们发现SWT的表现优于Swing。 这种期望源于基于SWT的Java更高的响应能力 应用程序(例如EclipseIDE)与基于Swing的应用程序相比。 然而,这一预期无法从数量上得到证实。它是 感知的响应性可能是较小的 响应用户交互所需的时间,这不仅包括 绘图,但也检测和响应用户的行动。也, 决定论(较小的标准偏差)可能导致更大的 感知反应


来源:

Swing确实使用了大量内存,但我不认为它是“内存猪”

正如一个回复所说,在Swing中,每个组件都是自己绘制的(不使用操作系统的原始小部件),这就是Swing跨平台可移植的原因

在我看来,Look'n'Feel这个概念非常好,但是它当然有一些缺点(内存消耗)。但是,我发现这一缺点在很大程度上被只需一行代码就可以立即改变应用程序的外观和感觉的可能性所抵消。有明显的第三方外观(一些商业的,一些开源的),可以给你的应用程序一些“友好”的外观


此外,内存使用也源于JDK(至少在6之前)在内存中加载(或预加载)类的方式:据我所见,在代码中运行一些Swing API时,整个Swing库都会被加载,即使您可能不需要加载所有的小部件。这可能会在JDK7(我还没有测试过)和“拼图”中发生变化。

“我听说……”您对这句话有什么参考资料吗?否则,在我看来,这似乎有点主观。我没有任何参考资料证实或反驳关于Swing内存使用的任何说法,因此我要问这个问题。这不是问题的真实答案,当OP询问内存使用情况时,你会向我们介绍性能(尽管我承认第二个可能会对第一个产生一些影响)你的观点很好。我的回答可能不是最好的结论。但是报告中的表格显示了所使用的资源,并给出了我所见过的最好的比较。这个报告已经过时了,没有显示内存资源消耗。我还对JTable获得的时间差感到惊讶,我想知道代码是如何编写的。那么为什么eclipse使用的RAM和intellij一样多呢?我的计算机上的Visual studio使用100-200 mb,而intellij和eclipse可以使用300-900,通常平均为500。@Paul1076:可能是因为RAM的使用比GUI更多?比如什么?java中缺少值类型等等?@paul1076:你是个程序员,对吗?你知道,仅仅因为两个程序在用户看来有点相似,并不意味着它们在内部的工作方式相同吗?期望他们使用相同数量的RAM有点像期望Windows和Mac都使用相同数量的RAM…这与这些特定程序无关,看看netbeans,它消耗的RAM也是VS的3-5倍,看看用java编写的torrent客户端,比如Vuze,它使用300mb的RAM,而bittorrent只使用了20个。另外,每当我运行一个名为sharpdevelop的ide时,它通常使用80-120mb的ram。我一直在想,是java平台,还是他们的GUI库的编写方式让他们如此占用内存。