有没有高级的故障排除技术,我可以尝试调试挂起的JavaFX进程?

问题描述 投票:0回答:1

所以这有点像面条刮擦器,我想知道外面是否有人对我可以尝试的内容有所了解。

JRE / JDK是1.8.0_251,在Windows 10上运行。应用程序是使用launch4j启动的JavaFX应用程序。

有时退出应用程序时,JVM不会关闭。相反,我有一个进程滞留在任务管理器中,直到我明确关闭它为止。它曾经是断断续续的,现在几乎是恒定的。

我怀疑我的用户线程卡住了,这阻止了应用程序的关闭。但是,我无法收集有用的线程转储以查看是否可以确定在哪里创建线程。

[遇到这种情况时,我通过tasklist / wmic标识了进程ID(JMC没有看到该进程),然后尝试对其运行jstack:

  • “ jstack -F”有效,但是删除所有有用的信息,例如线程名称或线程类型(守护程序/用户)。没有线程包含对我的代码的任何引用。
  • “ jstack -l”曾经工作过,我看到了两个受影响的线程,它们名为“ pool-#-thread-#”,它们不是守护程序线程,但是在将JRE更新推送到我的机器后,我不得不安装_251 JDK。从那以后,它就永远挂了。 (我将其运行了几个小时,没有任何变化)

如果我可以重新运行jstack -l,那么在帮助我确定导致此问题的执行器池方面将大有帮助。该应用程序产生了几个不同的池,而我所知的几个池在它们生成的线程上显式设置了守护程序标志。

有趣的是,从Eclipse运行应用程序时,我遇到类似的问题。我团队中的其他任何人都无法重现此问题,并且只有在我收到了替换笔记本电脑后才开始出现此问题。您可能会认为,如果存在粘性用户线程,其他人也会遇到同样的问题。这使我认为可能涉及到环境/硬件问题,或者可能触发了JRE错误。

有人能成功解决jstack挂起的问题吗?在应用程序无法关闭时获取线程转储的任何技巧吗?

java multithreading hang jstack
1个回答
1
投票

因此,在再次讨论了一段时间之后,我至少取得了一些进展,并且对导致问题的原因有一个很好的了解,尽管不一定要立即解决它。

通过jstack -F获得的线程转储包含一个讲述故事的行,因为我专注于以下事实:接收到的输出中没有线程名/守护程序状态:

Thread 22: (state = IN_NATIVE)
- com.sun.prism.d3d.D3DPipeline.nDispose() u/bci=0 (Interpreted frame)
- com.sun.prism.d3d.D3DPipeline.dispose() u/bci=49, line=164 (Interpreted frame)
- com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.cleanup() u/bci=9, line=118 (Interpreted frame)
- com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run() u/bci=14, line=127 (Interpreted frame)
- java.lang.Thread.run() u/bci=11 (Interpreted frame)

[Java支持已经很多年了,我知道硬件加速的Java UI可能会对某些图形卡/驱动程序造成麻烦。因此,我尝试使用JVM上的-Dsun.java2d.d3d=false标志禁用d3d渲染器。无法重现挂起。

当然,对于我来说,仅禁用硬件加速不是理想的解决方案,因此我一直在更深入地研究该问题。上面的调用堆栈使我了解了-Dprism.verbose标志,该标志为我提供了有关所使用的卡的更多信息。 (内部Intel GPU而不是我的外部GPU)

我一直尝试升级驱动程序,并将研究如何将棱镜从使用英特尔芯片组切换到专用GPU,并查看是否可以解决问题。但是至少,我确实可以选择完全禁用d3d加速。

© www.soinside.com 2019 - 2024. All rights reserved.