我有一个偶尔挂起/冻结的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不高,计算机运行速度不慢。
我的应用程序代码由许多类组成,因此在此处包含它并不是直接的,特别是因为我不知道哪种方法导致冻结。因此,我的问题比我想要的更广泛:
答案 0 :(得分:0)
你试过AOP吗?
在你的情况下,它允许你在你使用的每个方法之前和之后运行一个方法,如果你记录了这些时间大于某个时间的东西,那么你可以确定导致它的代码位,例如记录方法内的时间是否大于5秒
请参阅here获取该教程
答案 1 :(得分:0)
感谢John16384和Mipa的回复......
我使用javafx-maven-plugin Maven插件,所以JavaVM参数包括:
<jvmArgs>
<jvmArg>-Dprism.verbose=true</jvmArg>
<jvmArg>-Dprism.order=sw</jvmArg>
</jvmArgs>
在我的插件配置中。由于包含了这个,我们几天都没有冻结。我希望这是 最终解决方案!