【问题标题】:Java 8u40 Swing GUI performanceJava 8u40 Swing GUI 性能
【发布时间】:2018-02-05 21:29:24
【问题描述】:

我有一个呈现非常复杂的 Swing GUI 的应用程序。 GUI 总共包含大约 60 000 个不同的控件(主要是标签,较少的文本字段)。基本上,它是一个表格,其中许多单元格中的每一个都包含一个带有少量标签和一个文本框的独立控件。

我突然遇到的问题与 8u40 之后(包括)之后的 java 版本有关。项目使用 JDK 8u122 构建。当我使用 Java 8u31 运行我的应用程序时,一切正常且顺利。当我使用超过 8u31 的任何 Java (JRE) 运行我的应用程序时,应用程序开始渲染我的复杂控件,然后很快占用 100% 的 CPU 并且它全部阻塞,我必须终止我的应用程序。

这是为什么呢?我正在检查 8u40 的补丁说明,但我找不到任何可能导致如此大的减速的东西。

你有什么想法吗?

【问题讨论】:

  • 您可以访问 Profiler 吗?在这种极端情况下,分析器可能会引导您找到正确的方向来查明问题。
  • 你是说JProfile?我尝试了“VisualVM”,但一旦 CPU 使用率达到 100%,VisualVM 也会变得无响应。我还检查了 beta 版本,u155,同样的事情发生了。进一步检查,我偶然发现了这个未解决的错误。也许它是相关的......bugs.openjdk.java.net/browse/JDK-8091556
  • JProfiler、YourKit、VisualVM,有许多可用的 Java Profiler。该错误与 JavaFX 有关,您编写了 Swing UI。如果分析器变得无响应,通常是由于分析应用程序中正在进行垃圾收集(停止世界阶段)。您可能会尝试做一些 GC 日志记录,看看这是否是问题所在。或者在 8u31 和 8u40+ 变得无响应之前比较内存使用情况。
  • “GUI 总共包含大约 60 000 个不同的控件(主要是标签,较少的文本字段)。” 也许您应该重新设计应用程序。仅包含有限数量的控件。 “基本上,它是一张桌子..” 你的意思是JTable?如果操作正确,将(最多)拥有与列一样多的控件。他们使用“flyweight 模式”来渲染JTable 之类的东西,这意味着将使用一个控件在每一行中渲染该单元格。
  • (很久以前)我记得非常相似的问题(> Java6_25<Java6_31 ??? 或 <Java6_32???)每个基于 Swing 的应用程序与 inmemory db 和 SwingWorker 导致类似的缺乏,不知道问题,但从未有过更新的版本...,没有/任何帮助,跟踪,在 sun_bug 中报告

标签: java swing user-interface


【解决方案1】:

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

没有它,即使在较新的 Java 版本上也能正常工作。

现在,有这么多控件,我需要-XX:-UseAdaptiveSizePolicy

【讨论】:

  • 我很困惑,首先你说没有它就可以工作,然后你说你需要它。现在怎么样了?
  • 没有它自定义控件也可以工作,但需要 1GB 的 RAM :) 使用该 VM 参数(在 Java 8u40 之前可以正常工作)应用程序将内存消耗保持在大约 350 MB
猜你喜欢
  • 2017-10-23
  • 2012-06-26
  • 2015-09-11
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多