Java 8u40 Swing GUI 性能

5
我有一个应用程序,它呈现非常复杂的Swing GUI。GUI包含总共约60,000个不同的控件(大多数是标签,少量是文本字段)。基本上,它是一个表格,每个单元格都包含一个独立的控件,其中有几个标签和一个文本框。
我突然遇到的问题与8u40之后的Java版本相关。该项目是使用JDK 8u122构建的。当我使用Java 8u31运行我的应用程序时,一切正常顺畅。当我使用任何8u31之后的Java(JRE)运行我的应用程序时,应用程序开始渲染我的复杂控件,然后很快占用了100%的CPU并且所有内容都被阻塞,必须结束我的应用程序。
为什么会这样?我正在检查8u40的补丁说明,但我找不到任何可能导致如此大的减速的原因。
你有什么想法吗?

你有性能分析器吗?在这种极端情况下,性能分析器可能会帮助你找到问题的根源。 - cello
你的意思是JProfile吗?我尝试了"VisualVM",但一旦CPU使用率达到100%,VisualVM也会失去响应。我还检查了beta版本、u155,同样的情况发生。进一步检查时,我偶然发现了这个未解决的bug。也许它有关联...https://bugs.openjdk.java.net/browse/JDK-8091556 - guest86
3
有许多Java Profilers可供使用,如JProfiler、YourKit和VisualVM。那个错误涉及到JavaFX,而您提到了Swing UI。如果profiler变得无响应,通常是因为被profiled的应用程序正在进行垃圾回收(停顿阶段)。您可以尝试进行一些GC日志记录以查看是否存在此问题。或者在它变得无响应之前比较8u31和8u40+的内存使用情况。 - cello
3
GUI包含大约60,000个不同的控件(主要是标签,较少的文本字段)。也许您应该重新设计应用程序,只包括有限数量的控件。基本上,这是一个表格...你是不是指JTable?如果正确地完成,它将具有与列数相同的最多控件数量。对于渲染诸如JTable之类的东西,它们使用'flyweight pattern',这意味着一个控件将用于在每一行中呈现该单元格。 - Andrew Thompson
很久以前,我记得有一个非常相似的问题(> Java6_25<Java6_31?或<Java6_32?),所有基于Swing的具有内存数据库和SwingWorker的应用程序都会导致类似的缺陷。对于这个问题,我没有任何想法,也没有在 sun_bug 上发现任何帮助、追踪或报告。但是,更新版本从未再次出现这种问题... - mKorbel
显示剩余3条评论
1个回答

1

这似乎与我正在使用的-XX:-UseAdaptiveSizePolicy虚拟机参数有关!

没有它,即使在更新的Java版本上也可以正常工作。

现在,由于有如此多的控制,我需要-XX:-UseAdaptiveSizePolicy


1
我有点困惑,你先说它可以不用,然后又说你需要它。那现在是怎样的情况? - user330315
自定义控件可以在没有它的情况下工作,但需要1GB的RAM :) 有了这个VM参数(在Java 8u40之前很好用),应用程序的内存消耗保持在约350 MB左右。 - guest86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接