java - 如何跟踪棘手的JavaFx卡住/挂起

标签 java multithreading javafx

我有一个JavaFX 8应用,它有时会挂起/冻结。我觉得我已经排除了造成此问题的许多原因,但它仍在发生。

不幸的是,我无法按需复制冻结/挂起。实际上,这仅发生在(到目前为止)我同事的计算机上。它可能在应用程序运行后不久发生,或者可能在数小时后发生,或者根本没有发生。在任何用户启动事件(例如按下按钮)之后,都不会发生这种情况。

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

后台线程每秒可能读取数百个数据更新,因此我应用了限制功能来防止UI上的更新过多,如此处建议的:Throttling javafx gui updates

用户可以启动一些很长的任务,这些任务在JavaFX UI线程上运行,或者使用Task方法。我知道并期望在JavaFX UI线程上调用执行时间较长的方法时,JavaFX UI会阻塞/冻结。但是,只有通过用户按下按钮才能进行此类调用,并且如上所述,冻结发生时没有用户以任何方式与App进行交互。

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

看来只有JavaFX UI被冻结了。后台线程继续运行而没有错误。

发生冻结时,CPU容量不高,计算机运行也不慢。

我的App代码由许多类组成,因此在此处将其包括在内并不是一件容易的事,尤其是因为我不知道哪种方法会导致冻结。因此,我的问题比我想要的要广泛得多:

  • 鉴于上述主张,您对什么有任何建议
    可能是这种错误的原因?
  • 鉴于上述断言,请执行
    您对什么可能是另一种跟踪方式有任何建议
    这样的错误?
  • 最佳答案

    您是否尝试过AOP?

    Aspect Orientated programming

    在您的情况下,它允许您在使用每个方法之前和之后运行一个方法,如果您记录了一些时间(如果这些时间大于某个时间),则可以确定是哪段代码引起了该问题,例如记录方法内的时间是否大于5秒

    请参阅here以获取有关该教程的信息

    关于java - 如何跟踪棘手的JavaFx卡住/挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955247/

    相关文章:

    java - Eclipse 中安装的 JRE 中的 "Standard VM"和 "MacOS X VM"有什么区别?

    c - 使用 pthread 获取总线错误 10

    java - 处理 100 万条记录的执行器框架

    java - 在 JAVAFX 中加载图像

    Java 偏序 Collection<E>

    java - 将项目从 Windows 导出到 Debian 时出现 Mysql 错误

    java - 线程中的每个操作都发生在该线程中按程序顺序稍后出现的每个操作之前

    JavaFX 表未填充

    java - 如何在 JavaFX 中对任务进行排队?

    java - 如何将JTable添加到JTabbedPane中?