JavaFX 8 QuantumRenderer alto uso de CPU
Tengo una aplicación JavaFX que contiene dos vistas de lista que muestran los pedidos de clientes entrantes (usando una fábrica de células personalizada) recibidos de mi servidor. También tengo algunas vistas de tabla que muestran información de una base de datos de Postgres (esto se extiende en unas pocas pestañas dentro de un panel de pestañas). El usuario debe tomar un pedido (haciendo clic en él) e ingresar información en los cuadros de texto.
La aplicación fue inicialmente escrita 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 funciona bien pero, después de 2-3 horas de tiempo de actividad, se vuelve lenta. Como es difícil para mí simular el comportamiento dentro de un generador de perfiles, utilicé jstack,top -H
y coincidenciapid
connid
para averiguar qué está pasando.
De esta manera descubrí que el culpable eraQuantumRenderer
con 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 64 bits de Lubuntu.
No puedo entender dónde debo mirar para averiguar cuál es el problema ...