tutorial started getting example documentacion javafx cpu renderer

started - Alto uso de CPU de JavaFX 8 QuantumRenderer



javafx import (1)

Tengo una APLICACIÓN JavaFX que contiene dos vistas de lista que muestran los pedidos entrantes de los clientes (utilizando un factor de celda personalizado) recibidos de mi servidor. También tengo algunas vistas de tabla que muestran información de una base de datos de Postgres (esto se distribuye en algunas pestañas dentro de un tabpane). El usuario tiene que tomar un pedido (haciendo clic en él) e ingresar un poco de información dentro de los cuadros de texto.

La aplicación fue escrita inicialmente y desplegada usando Java7. No tuve ningún problema en absoluto. Pero recientemente decidí cambiar a Java8. Modifiqué mi código para usar lambdas y agregué algunas cosas adicionales a la aplicación:

  • una línea de tiempo para verificar y mostrar el estado de los pedidos cada minuto, dentro de un flujo de texto;
  • modificó la clase customcellfactory para usar un CSS externo, con setId en lugar de setStyle;
  • ...

Ahora, la aplicación se está ejecutando bien pero, después de 2-3 horas de funcionamiento, se vuelve lento. Ya que es difícil para mí simular el comportamiento dentro de un generador de perfiles, utilicé jstack, top -H y unir pid con nid para averiguar qué está sucediendo.

De esta manera descubrí que el culpable era QuantumRenderer con un 95% de uso de CPU:

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)

La máquina que ejecuta la aplicación está utilizando una versión de Lubuntu de 64 bits.

No puedo averiguar dónde debo mirar para averiguar cuál es el problema ...


Parece que su procesador está utilizando la canalización X11 (¿Java2D?) Que podría ser la causa del alto uso de la CPU (aceleración del software). ¿Su tarjeta gráfica es compatible con la aceleración de hardware?

Intente obtener más información con -Dprism.verbose=true Si su tarjeta gráfica admite la aceleración de hardware, puede intentar forzarla con -Dprism.forceGPU=true . También intente habilitar la canalización de OpenGL para aumentar el rendimiento de Java2D con -Dprism.order=es2,es1,sw,j2d (también puedes probar con el antiguo indicador Java2D -Dsun.java2d.opengl=true pero creo que eso no afectará al prisma).

También recomendaría echar un vistazo a las listas de verificación de trucos y consejos de rendimiento de OpenJFX. He visto un alto uso de la CPU en nodos que de alguna manera se solucionó con el uso de Node.setCache(true) y sus CacheHints al usar cualquier tipo de animación (con el desventaja que esto usa más memoria).

Además, eche un vistazo a cómo está actualizando su UI desde los subprocesos de trabajo. Es importante hacer un trabajo mínimo en el subproceso de la interfaz de usuario de FX y actualizarlo de sus trabajadores correctamente y solo cuando sea necesario, consulte esta otra pregunta para obtener más información sobre la clase javafx.concurrent.Task y su uso correcto para actualizar la interfaz de usuario. hilos de trabajo.

Esto se parece mucho más a un problema de aceleración de software y Dprism.verbose debería hacerle saber más, ¡pero seguir las otras sugerencias nunca duele! ¡Espero que esto ayude!