Существуют ли расширенные методы устранения неполадок, которые я могу попытаться отладить в процессе JavaFX, который зависает при закрытии?

Так что это немного похоже на лапшу, и мне было интересно, есть ли у кого-нибудь идеи о вещах, которые я мог бы попытаться докопаться до сути этого.

JRE/JDK — 1.8.0_251, работает в Windows 10. Приложение — это приложение JavaFX, запускаемое с помощью launch4j.

Иногда, когда я выхожу из приложения, JVM не выключается. Вместо этого у меня зависает процесс в диспетчере задач, пока я его явно не закрою. Раньше было переодически, сейчас почти постоянно.

Я подозреваю, что у меня застрял пользовательский поток, который блокирует закрытие приложения. Однако мне не удалось собрать полезный дамп потока, чтобы узнать, могу ли я определить, где создается поток.

Когда я сталкиваюсь с этой ситуацией, я идентифицирую идентификатор процесса через список задач / wmic (JMC не видит процесс), затем я пытаюсь запустить против него jstack:

  • «jstack -F» работает, но удаляет всю полезную информацию, такую ​​как имена потоков или тип потоков (демон/пользователь). Ни один из потоков не содержит ссылок на мой код.
  • "jstack -l" раньше работал, и я видел два затронутых потока с именем "pool-#-thread-#", которые не были потоками демона, но затем мне пришлось установить _251 JDK после того, как обновление JRE было отправлено на мою машину, и поскольку затем он просто зависает навсегда. (Я оставил его работать в течение нескольких часов, без изменений)

Если бы я мог получить возможность запустить jstack -l обратно, это помогло бы мне определить пул Executor, вызывающий это. Приложение порождает несколько разных пулов, и те немногие из них, которые я знаю, явно устанавливают флаг демона для потоков, которые они генерируют.

Интересно, что у меня похожая проблема при запуске приложения из Eclipse. Никто из других людей в моей команде не может воспроизвести эту проблему, и эта проблема началась только после того, как я получил новый ноутбук. Можно подумать, что если бы была закрепленная тема пользователя, другие люди увидели бы ту же проблему. Это заставляет меня думать, что может быть что-то связанное с окружающей средой/аппаратным обеспечением или что я могу вызвать ошибку JRE.

Кто-нибудь успешно устранил подобную проблему, когда jstack зависает? Любые приемы для получения дампа потока, когда приложение не может закрыться?


person Bluetopia    schedule 15.05.2020    source источник


Ответы (1)


Итак, покопавшись в этом снова в течение некоторого времени, я, по крайней мере, добился некоторого прогресса и хорошо понимаю, что вызывает проблему, хотя пока не обязательно, как ее решить.

Дамп потока, полученный с помощью jstack -F, содержал контрольную строку, которую я пропустил, сосредоточившись на том факте, что в полученном выводе не было имен потоков/статуса демона:

Thread 22: (state = IN_NATIVE)
- com.sun.prism.d3d.D3DPipeline.nDispose() u/bci=0 (Interpreted frame)
- com.sun.prism.d3d.D3DPipeline.dispose() u/bci=49, line=164 (Interpreted frame)
- com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.cleanup() u/bci=9, line=118 (Interpreted frame)
- com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run() u/bci=14, line=127 (Interpreted frame)
- java.lang.Thread.run() u/bci=11 (Interpreted frame)

Занимаясь поддержкой Java в течение многих лет, я знаю, что пользовательский интерфейс Java с аппаратным ускорением может иметь проблемы с некоторыми видеокартами/драйверами. Поэтому я попытался отключить средство визуализации d3d, используя флаг -Dsun.java2d.d3d=false на JVM. Не удалось воспроизвести зависание.

Конечно, простое отключение аппаратного ускорения — не идеальное решение для меня, поэтому я углубился в поиск и устранение проблемы. Приведенный выше стек вызовов позволил мне узнать о флаге -Dprism.verbose, который дал мне больше информации о том, какая карта используется. (Внутренний графический процессор Intel, а не мой внешний графический процессор)

С тех пор я попытался обновить драйверы и посмотрю, как я мог бы переключить prism с использования набора микросхем Intel на мой выделенный графический процессор и посмотреть, решит ли это проблему. Но, по крайней мере, у меня есть возможность полностью отключить ускорение d3d.

person Bluetopia    schedule 31.05.2020