如何追踪棘手的JavaFx冻结/挂起

时间:2017-03-22 14:55:35

标签: java multithreading javafx

我有一个偶尔挂起/冻结的JavaFX 8应用程序。我觉得我已经排除了问题的很多原因,但它仍然在发生。

不幸的是我无法按需重现冻结/挂起。它实际上只发生在我同事的电脑上(到目前为止)。它可能在应用程序运行后不久发生,或者可能在数小时后发生,或者根本不会发生。在任何用户启动的事件(例如按下按钮)之后,会发生。

我有几个后台线程正在运行,从套接字读取数据并更新JavaFX UI。这些更新总是通过Platform.runLater()方法完成。

后台线程可能每秒读取数百个数据更新,因此我已应用限制来防止UI上有太多更新,如下所示:Throttling javafx gui updates

用户可以启动一些长期(ish)任务,这些任务在JavaFX UI线程上运行,或者使用Task方法。我知道并期望JavaFX UI在JavaFX UI线程上调用具有长执行时间的方法时阻塞/冻结。但是这样的呼叫仅由用户按下按钮而 ,并且如上所述,在用户不以任何方式交互App的情况下发生冻结。

我在同事的计算机上遇到了冻结(两次),并在JConsole和VisualVM中检查过程。线程转储显示没有死锁。当我将线程转储与非冻结的JavaFX App线程转储进行比较时,没有明显的差异。

似乎只冻结了JavaFX UI。后台线程继续而没有错误。

当冻结发生时,CPU不高,计算机运行速度不慢。

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

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

2 个答案:

答案 0 :(得分:0)

你试过AOP吗?

Aspect Orientated programming

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

请参阅here获取该教程

答案 1 :(得分:0)

感谢John16384和Mipa的回复......

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

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

在我的插件配置中。由于包含了这个,我们几天都没有冻结。我希望这是 最终解决方案!