首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaFX 8 QuantumRenderer高CPU使用率

JavaFX 8 QuantumRenderer高CPU使用率
EN

Stack Overflow用户
提问于 2014-09-18 14:48:44
回答 1查看 5.2K关注 0票数 19

我有一个JavaFX应用程序,其中包含两个列表视图,显示从我的服务器收到的传入客户订单(使用自定义单元工厂)。我还有一些用于显示Postgres数据库信息的表视图(这些表视图分布在选项卡窗格中的几个选项卡中)。用户必须接受订单(通过单击),并在文本框中输入一些信息。

该应用程序最初是使用Java7编写和部署的。我没有任何问题。但最近我决定改用Java8。我修改了代码以使用lambdas,并在应用程序中添加了一些额外的东西:

  • 用于在文本流中每分钟检查和显示订单状态;
  • 修改了customcellfactory类以使用外部CSS,使用setId而不是setStyle;
  • ...

现在,应用程序运行良好,但在2-3小时的正常运行时间后,它会变得迟缓。因为我很难模拟分析器中的行为,所以我使用了jstack、top -H,并将pidnid进行匹配,以找出发生了什么。

通过这种方式,我发现罪魁祸首是具有95+% CPU使用率的QuantumRenderer

代码语言:javascript
复制
  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。

我不知道我应该去哪里找出问题所在。

EN

回答 1

Stack Overflow用户

发布于 2015-08-21 09:07:21

您的渲染器似乎正在使用X11管道(Java2D?)这可能是高CPU使用率(软件加速)的原因。您的显卡是否支持硬件加速?

尝试使用-Dprism.verbose=true获取更多信息如果您的显卡确实支持硬件加速,您可能想尝试使用-Dprism.forceGPU=true强制它,同时尝试使用-Dprism.order=es2,es1,sw,j2d启用OpenGL管道以提高Java2D性能(您也可以尝试使用旧的Java2D标志-Dsun.java2d.opengl=true,但我认为这不会影响棱镜)。

我还建议看看OpenJFX performance tips and tricks checklist,我看到节点的CPU使用率很高,在使用任何类型的动画时,Node.setCache(true)和它的CacheHints的使用在某种程度上得到了修复(缺点是它使用了更多的内存)。

另外,看看您是如何从工作线程更新UI的。在FX UI线程中做最少的工作并从你的工作线程中正确地更新它是很重要的,只有在必要的时候,看看this other question来了解更多关于javafx.concurrent.Task类的信息,以及它从工作线程更新UI的正确用法。

这似乎更像是一个软件加速问题,Dprism.verbose应该让你知道更多,但遵循其他建议并不会有什么坏处!希望这能有所帮助!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25906033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档