gpt4 book ai didi

JavaFX 8 QuantumRenderer 高 CPU 使用率

转载 作者:行者123 更新时间:2023-12-03 13:01:10 26 4
gpt4 key购买 nike

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

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

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

  • 现在,应用程序运行良好,但在正常运行 2-3 小时后,它变得缓慢。因为对我来说很难模拟我使用 jstack 的分析器中的行为, top -H , 并匹配 pidnid找出正在发生的事情。

    这样我发现罪魁祸首是 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。

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

    最佳答案

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

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

    我还建议看看 OpenJFX performance tips and tricks checklist我在使用 Node.setCache(true) 的节点中看到了较高的 CPU 使用率。及其CacheHints使用任何类型的动画时(缺点是使用更多内存)。

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

    这看起来更像是一个软件加速问题,Dprism.verbose 应该让您知道更多,但遵循其他建议永远不会有坏处!希望这可以帮助!

    关于JavaFX 8 QuantumRenderer 高 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25906033/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com