У меня есть приложение JavaFX, содержащее два списка, отображающих входящие заказы клиентов (с использованием пользовательской cellfactory), полученные с моего сервера. У меня также есть несколько таблиц, отображающих информацию из базы данных Postgres (это распространяется на несколько вкладок внутри вкладки). Пользователь должен сделать заказ (щелкнув по нему) и ввести несколько информации внутри текстовых полей.
Вначале приложение было развернуто с использованием Java7. У меня не было никаких проблем. Но недавно я решил переключиться на Java8. Я изменил свой код, чтобы использовать lambdas, и добавил в приложение несколько дополнительных материалов:
- временную шкалу для проверки и отображения состояния заказов каждую минуту, внутри текстового потока;
- изменил класс customcellfactory для использования внешнего CSS, с setId вместо setStyle;
- ...
Теперь приложение работает нормально, но после 2-3 часов работы он становится вялым. Поскольку мне сложно моделировать поведение внутри профилировщика, я использовал jstack, top -H
и сопоставлял pid
с nid
, чтобы узнать, что происходит.
Таким образом, я узнал, что виновником было QuantumRenderer
с 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)
Аппарат, запускающий приложение, использует версию Lubuntu версии 64Bit.
Я не могу понять, где я должен искать, в чем проблема...