【发布时间】:2017-08-14 18:42:48
【问题描述】:
我有一个 JavaFX 8 应用程序偶尔会挂起/冻结。我觉得我已经排除了问题的许多原因,但它仍然在发生。
很遗憾,我无法按需重现冻结/挂起。它实际上只发生在(到目前为止)我同事的电脑上。它可能在应用程序运行后不久发生,也可能在数小时后发生,或者根本不发生。它确实不会在任何用户发起的事件(例如按下按钮)之后发生。
我有一些后台线程正在运行,它们从套接字读取数据并更新 JavaFX UI。这些更新总是通过 Platform.runLater() 方法完成的。
后台线程每秒可能会读取数百个数据更新,因此我应用了节流来防止 UI 上的更新过多,如下所示:Throttling javafx gui updates
用户可以启动一些长的(ish)任务,这些任务在 JavaFX UI 线程上运行,或者使用 Task 方法。我知道并期望在 JavaFX UI 线程上调用具有较长执行时间的方法时 JavaFX UI 会阻塞/冻结。但此类调用仅由用户按下按钮进行,并且如上所述,在用户以任何方式与应用程序交互的情况下发生冻结。
我在同事的计算机上发现了冻结(两次)并检查了 JConsole 和 VisualVM 中的进程。线程转储显示没有死锁。当我将线程转储与未冻结的 JavaFX App 线程转储进行比较时,没有明显差异。
似乎只有 JavaFX UI 被冻结。后台线程继续正常运行。
出现卡顿时CPU不高,电脑运行不慢。
我的应用程序代码包含许多类,因此在此处包含它并不直接,尤其是因为我不知道哪种方法会导致冻结。因此,我的问题比我想的要广泛:
- 鉴于上述断言,您有什么建议吗? 可能是导致此类错误的原因?
- 鉴于上述断言,执行 您对另一种追踪方式有任何建议 这样的错误?
【问题讨论】:
-
可能不是一个非常方便的提示,但如果其他一切都失败了(看起来您尝试了很多不错的选择),请记录应用程序正在执行的所有操作。然后,您可以通过检查时间戳或丢失的堆栈跟踪来推断导致 UI 冻结的区域。
-
这样的冻结问题也可能与硬件有关,它是否发生在多台机器上?它们之间有什么共同点吗? JavaFX 使用硬件加速图形,如果出现问题,只冻结 UI 听起来似乎是合理的。
-
添加您观察到此行为的系统信息可能会有所帮助。
-
正如 John 所指出的,这可能是图形硬件/驱动程序问题。因此,尝试将选项 -Dprism.order=sw 与 -Dprism.verbose=true 结合使用可能会有所帮助,以查看问题是否仍然存在。
-
嗨,米帕 - 谢谢。实际上,我自己只是偶然发现了这一点,我现在要尝试一下。我会回来更新的。
标签: java multithreading javafx