JavaFX 滚动表更新性能随着时间的推移而降低

2024-04-22

我有一个 TableView,显示最后 N 个项目、顶部的新项目、从底部删除项目等...似乎发生的情况是 CPU 负载随着时间的推移而增加,导致同一台计算机上的其他 X 应用程序变得缓慢。

平台详细信息:Redhat 6.7,32 位,Java 1.8u40

我尝试过的事情

  • 引入了 runLater() - 原始代码从非 FX 线程更新了可观察列表 - 显然这是错误的
  • 优化 - 如果尚未进行更新,则仅在 JavaFX 应用程序线程上放置新的 Runnables
  • 优化 - 批量更新可观察列表而不是单独添加
  • 使用jvisual VM来识别任何内存泄漏,找不到任何东西。
  • I've tried to recreate this
    • Windows 7(在金属上)- JDK 8u40 64 位 => 不会发生
    • Ubuntu 16.04 JDK 8u40 64 位(在具有 vmwgfx 的虚拟机内)=> 不会发生
    • Ubuntu 16.04 OpenJDK + OpenJFX 最新版 (8u91)(在金属上)=>does occur

VisualVM - 犹太硬件上的 Redhat 6u7(32 位)

VisualVM - 旧硬件 (2008 iMac) 上的 Ubuntu 16.04(64 位)

这个问题是较大应用程序的一部分,但我将其隔离为下面的一个较小示例。这使得其他应用程序在几分钟后变得缓慢,但仅限于 Redhat 6u7 平台。

public class TableUpdater extends Application {
    private int maxItems = 30;
    private AtomicBoolean pending = new AtomicBoolean();
    public class Thing {
        private String foo;
        public Thing(String foo) {
            this.foo = foo;
        }
        public String getFoo() {
            return foo;
        }
        @Override
        public int hashCode() {
            return foo.hashCode();
        }
        @Override
        public boolean equals(Object obj) {
            if (! (obj instanceof Thing)) {
                return false;
            }
            return ((Thing)obj).foo.equals(foo);
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

    private int counter = 0;
    private ObservableList<Thing> data;
    private List<Thing> itemsToAdd = Collections.synchronizedList(new ArrayList<Thing>());

    @Override
    public void start(Stage primaryStage) throws Exception {
        TableView<Thing> table = new TableView<>();
        data = FXCollections.observableArrayList();
        table.setItems(data);

        TableColumn<Thing, String> fooCol = new TableColumn<>("Foo");
        fooCol.setCellValueFactory(new PropertyValueFactory<Thing, String>("foo"));
        table.getColumns().addAll(fooCol);

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
            add(new Thing(String.format("%08d", counter++)));
        }, 0, 2, TimeUnit.MILLISECONDS);

        primaryStage.setScene(new Scene(table));
        primaryStage.setWidth(400);
        primaryStage.setHeight(400);
        primaryStage.show();
    }

    private void add(Thing thing) {
        itemsToAdd.add(thing);

        if (!pending.getAndSet(true)) {
            Platform.runLater(() -> {
                synchronized (itemsToAdd) {
                    Collections.reverse(itemsToAdd);
                    data.addAll(0, itemsToAdd);
                    itemsToAdd.clear();
                }
                if (data.size() > maxItems) {
                    data.remove(maxItems, data.size());
                }
                pending.set(false);
            });
        }
    }
}

问题

  • 这个问题与我更新表的方式或潜在的错误有关吗?
  • 还有更有效的方法来更新表吗?

尝试使用 G1GC 垃圾收集器。我有一个类似但不完全相同的问题(表视图中存在大量持久对象),该问题已通过使用 G1GC 解决。

java XX:+UseG1GC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 滚动表更新性能随着时间的推移而降低 的相关文章

  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • Java/JAXB:将具有相同名称但不同属性值的 XML 元素解组到不同的类成员

    我正在尝试根据其属性之一将具有多个 Fields 元素的 XML 解析为不同的类成员 这是 XML
  • 在 Jar 中为 Gluon Scene Builder 11.00 创建自定义控件

    我想在可执行 jar 文件中创建自定义控件 然后在 Gluon Scene Builder 11 00 中使用 我需要知道如何做到这一点 我尝试了几种形式 但在场景生成器中导入 jar 时我的控件没有出现 我正在使用 IntelliJ Co
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • Java String.format 向整数添加空格

    我有一小段代码 我不明白输出 此输出向我的字符串格式文本添加空格 我做错了什么吗 public class HelloWorld public static void main String args int a1 540 int a2 4
  • java 属性文件作为枚举

    是否可以将属性文件转换为枚举 我有一个包含很多设置的属性文件 例如 equipment height equipment widht equipment depth and many more like this and not all a
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何消除 jQuery Mobile 中的悬停延迟?

    我正在使用 jQuery Mobile 制作一个网站 当我将鼠标悬停在按钮上时 它会更改其类 并扩展其颜色 但感觉需要半秒左右才能完成 有没有办法减少这种延迟 您可以覆盖hoverDelay无需修改 jQuery Mobile js 库 要
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Java的hashCode可以为不同的字符串产生相同的值吗?

    使用java的哈希码函数是否可以为不同的字符串提供相同的哈希码 或者如果可能的话 其可能性的 是多少 Java 哈希码是 32 位 它散列的可能字符串的数量是无限的 所以是的 会发生冲突 百分比是没有意义的 项目 字符串 的数量是无限的 而
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s

随机推荐

  • 更改包名称

    我打算通过smali reverse 更改包名 当我打开 apktool yml 时 我看到了这个 强制包 ID 127 我尝试过更改它 但它崩溃了 我为什么要这样做 假设您的目标是重命名 apk 的包名称 则用于类的包名称是无关的 apk
  • THREE.js 导入的模型不应用面部纹理

    我正在尝试导入使用 THREEJS 导出器从搅拌机导出的模型 到目前为止 模型已加载并出现在我的场景中 并且正确应用了材质 汽车应为黄色 玻璃应为透明 但它并没有将我的纹理应用到以 tga 形式保存的汽车上 如果我不将纹理包含在模型所在的服
  • 为什么使用工厂而不是“新”?

    我正在看书其中指出 EMF 编程模型强烈鼓励但不要求 使用工厂来创建对象 而不是简单地使用 new 运算符创建 对象 为什么鼓励使用工厂new 您的答案不必是特定于 EMF 的 只要它与 Java 有关即可 您可以阅读 Effective
  • ng-repeat 没有 HTML 元素(这次真的没有任何)

    我想要得到类似的东西 Line 1 br Line 2 br Line 3 br Line 4 br Line 5 br 使用 ng repeat 各行之间不应有任何分隔符 除了 br 这是一个硬编码的简单指令 br HTML p p ap
  • 如何在 Webpack 中正确使用命名空间 Typescript

    我正在使用 webpack 开发一个新项目 这是我第一次尝试使用这个工具 自从 1 年以来 我一直使用 typescript 针对 angularJS 1 5 进行开发 并且从未遇到过与命名空间相关的任何问题 src App Core Ht
  • 在 Win 7 上安装 Python 2.7 32 位:没有注册表项?

    我已从 python org 下载了 Python 2 7 2 Windows x86 32 位 MSI 并将其安装在 64 位 Windows 7 系统上 一切正常 至少命令行解释器启动并运行 但安装过程不会创建任何PythonWindo
  • `fgetc()` 可能返回 `EOF` 的所有原因是什么?

    当然fgetc 回报EOF when 文件结尾 or an 输入错误 occurs 这就是全部吗 这是否意味着没有更多数据可用 FILE inf int ch while ch fgetc inf EOF if feof inf puts
  • Android中AIDL的实时示例和使用?

    我想知道aidl 的实时示例及其使用 我研究了有关此主题的android 开发人员博客 我无法在实时世界中实现这一点 谁能举个例子告诉我 AIDL用于以某种格式共享数据 primitive and parcelable 与其他应用程序 现实
  • 使用 Adob​​e Air 证书签署 Android Native apk

    我需要帮助使用为 Adob e Air 生成的现有 p12 证书来签署 Android 本机应用程序 几年前 应用程序在 Adob e Air 中完成 签名并发布到 Google Play 现在 当从 Adob e Air 迁移到 Andr
  • 通过 CSS 注入 HTML

    我需要基本上设置content来自 CSS 的 HTML 内容 我目前正在执行以下操作 myclass content img src 然而 我看到的不是图像 而是文字 img src hello png 如何使用 CSS 注入任意 HTM
  • 在数据库中存储条件逻辑表达式/规则

    如何使用 RDBMS 存储逻辑表达式 我标记对象并希望能够基于这些标记构建事实陈述 这些可能被视为虚拟标签 Tags new for sale used offer Rule second hand goods new or used an
  • 限制 TinyMCE 编辑器中的键盘快捷键

    试图找到在 TinyMCE 编辑器的 jQuery 版本中禁用单个键盘快捷键的位置 目前允许的快捷方式列表是 ctrl z Undo ctrl y Redo ctrl b Bold ctrl i Italic ctrl u Underlin
  • 如何将 Visual Studio 中的结构打包为包含 uint32_t 的 24 位?

    我正在尝试将现有应用程序从 32 位 ARM 微控制器移植到桌面平台 例如 Microsoft Windows GCC 在 ARM 上使用 我能够使用 32 位 MinGW 编译器在 Windows 上成功编译该应用程序 但是我使用 Mic
  • 如何让内部控件不覆盖主控件的事件?

    我有一个UserControl其中包含一些内部控件 像这样的东西 现在当我在我的项目中使用它时 我想要every如果单击 我的控件点会引发相同的单击事件 就像其他控件一样 但问题是 我的处理程序在另一个项目中 仅当我单击背景上的某个位置 而
  • AWS:找不到 iam 的实例元数据

    我正在尝试在我的 ec2 实例上设置 elasticsearch s3 快照 它失败并出现以下错误 nested NotSerializableExceptionWrapper sdk client exception The reques
  • 如何同时远程连接到多个 Glassfish 4+ 实例?

    我正在寻找一种从基于 Swing 的独立客户端 JDK7 SE 同时连接到 Glassfish 4 JDK7 EE 的多个实例的方法 我通过以下方式成功连接到单个实例 这就是初始上下文的构造 private void connect Str
  • 我可以检查安装的 Indy 版本吗?

    我需要使用最新的 Indy 组件库版本 我可以通过某些源代码命令或任何其他技巧来获取库版本 以确保我使用正确的库 我知道我正在使用indy 160 bpl 这是我的 Delphi XE2 将鼠标移动到组件栏上时所说的内容 我从中获取的最新
  • Spring事务中是否需要异常处理?

    我对事务的异常处理有疑问 为了清楚地说明我的问题 我想展示我的配置
  • fn 和 fn* 有什么区别?

    在 Clojure 中 fn 和 fn 有什么区别 当我在语法中引用使用 宏创建的函数时 我看到 fn 例如 在 REPL 中 user gt inc fn p1 342 343 auto clojure core inc p1 342 3
  • JavaFX 滚动表更新性能随着时间的推移而降低

    我有一个 TableView 显示最后 N 个项目 顶部的新项目 从底部删除项目等 似乎发生的情况是 CPU 负载随着时间的推移而增加 导致同一台计算机上的其他 X 应用程序变得缓慢 平台详细信息 Redhat 6 7 32 位 Java