【发布时间】:2017-11-14 18:08:53
【问题描述】:
我有一个 JavaFX APP,其中包含两个列表视图,显示从我的服务器收到的传入客户订单(使用自定义单元工厂)。我还有一些表格视图显示来自 Postgres 数据库的信息(这分布在选项卡窗格内的几个选项卡中)。 用户必须接受订单(通过单击它),并在文本框中输入一些信息。
该应用程序最初是使用 Java7 编写和部署的。我没有任何问题。 但最近我决定切换到 Java8。我修改了我的代码以使用 lambda,并在应用程序中添加了一些额外的东西:
- 在文本流中每分钟检查和显示订单状态的时间线;
- 修改 customcellfactory 类以使用外部 CSS,使用 setId 代替 setStyle;
- ...
现在,应用程序运行良好,但在正常运行 2-3 小时后,它变得迟缓。由于我很难模拟分析器中的行为,因此我使用了 jstack top -H,并将 pid 与 nid 匹配以找出发生了什么。
这样我发现罪魁祸首是QuantumRenderer,CPU使用率超过95%:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30300 utilizat+ 20 0 5801608 527412 39696 S 95,1 6,5 60:57.34 java
"QuantumRenderer-0" #9 daemon prio=5 os_prio=0 tid=0x00007f4f182bb800 nid=0x765c runnable [0x00007f4eeb2a1000]
java.lang.Thread.State: RUNNABLE
at com.sun.prism.es2.X11GLDrawable.nSwapBuffers(Native Method)
at com.sun.prism.es2.X11GLDrawable.swapBuffers(X11GLDrawable.java:50)
at com.sun.prism.es2.ES2SwapChain.present(ES2SwapChain.java:186)
at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:107)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:745)
运行应用程序的机器使用的是 64 位版本的 Lubuntu。
我不知道应该去哪里找出问题所在...
【问题讨论】:
-
@gontard 唉,就我而言,没有。但是我有一个相当大的
Graph,现在我设法将其缩小(提供更少的数据点)。关于 OP,我不知道。 -
@gontard 在我的情况下,问题是图形硬件加速。有一个解决方法:切换到软件渲染并禁用 vsync:java -jar -Dprism.order=sw -Dprism.vsync=false my_app.jar
-
我也看到了同样的问题。也需要几个小时才能显现。我在 com.sun.prism.es2.X11GLDrawable.swapBuffers(X11GLDrawable.java:50) 看到最后两个调用在 com.sun.prism.es2.X11GLDrawable.nSwapBuffers(Native Method) 的 QuantumRenderer-0 (X11GLDrawable.java:50) 我试过 - DPrism.order 以及 -DPrisim.force,都无济于事。我确实有一个 GPU,而 JAvaFX 确实说它支持 3D。这是 Prism 中的错误吗?
-
这个bug好像是相关的:bugs.openjdk.java.net/browse/JDK-8088984