【问题标题】:How To Trace A Tricky JavaFx Freeze / Hang如何跟踪棘手的 JavaFx 冻结/挂起
【发布时间】: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不高,电脑运行不慢。

我的应用程序代码包含许多类,因此在此处包含它并不直接,尤其是因为我不知道哪种方法会导致冻结。因此,我的问题比我想的要广泛:

  1. 鉴于上述断言,您有什么建议吗? 可能是导致此类错误的原因?
  2. 鉴于上述断言,执行 您对另一种追踪方式有任何建议 这样的错误?

【问题讨论】:

  • 可能不是一个非常方便的提示,但如果其他一切都失败了(看起来您尝试了很多不错的选择),请记录应用程序正在执行的所有操作。然后,您可以通过检查时间戳或丢失的堆栈跟踪来推断导致 UI 冻结的区域。
  • 这样的冻结问题也可能与硬件有关,它是否发生在多台机器上?它们之间有什么共同点吗? JavaFX 使用硬件加速图形,如果出现问题,只冻结 UI 听起来似乎是合理的。
  • 添加您观察到此行为的系统信息可能会有所帮助。
  • 正如 John 所指出的,这可能是图形硬件/驱动程序问题。因此,尝试将选项 -Dprism.order=sw 与 -Dprism.verbose=true 结合使用可能会有所帮助,以查看问题是否仍然存在。
  • 嗨,米帕 - 谢谢。实际上,我自己只是偶然发现了这一点,我现在要尝试一下。我会回来更新的。

标签: java multithreading javafx


【解决方案1】:

感谢 John16384 和 Mipa 的回复...

我使用 javafx-maven-plugin Maven 插件,所以 JavaVM 参数包括:

<jvmArgs>
    <jvmArg>-Dprism.verbose=true</jvmArg>
    <jvmArg>-Dprism.order=sw</jvmArg>
</jvmArgs>

在我的插件配置中。自从包括这个在内,我们已经有几天没有冻结了。我希望这是最终修复!

【讨论】:

  • 解决问题了吗?
【解决方案2】:

你尝试过 AOP 吗?

Aspect Orientated programming

在您的情况下,它允许您在使用的每个方法之前和之后运行一个方法,如果您在这些时间大于某个时间的情况下记录了某些内容,那么您可以确定是哪位代码导致它,例如如果方法内的时间大于 5 秒,则记录日志

请参阅 here 获取相关教程

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2020-09-21
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多