Как jstack сигнализирует основанный на Windows jvm для создания дампа потока?
У меня есть веб-приложение на основе Java, работающее на сервере Windows. JVM работает как служба Windows. Этот сервис периодически зависает (я использую этот термин свободно, поскольку я еще не определил первопричину), и я пытаюсь выяснить, почему это происходит.
Я хотел бы попытаться собрать дамп потока, однако когда я запускаю jstack, я получаю сообщение об ошибке "Отказано в доступе". Это происходит только тогда, когда служба перешла в состояние ожидания. Я могу использовать ту же команду jstack, когда служба работает нормально, чтобы создать дамп потока. Так что я не думаю, что это обязательно вопрос разрешения. Я думаю, что кое-что о состоянии службы во время зависания препятствует тому, чтобы запрос дампа потока достигал jvm.
Я понимаю, что в системах на основе Unix выполнение команды kill - 3 отправляет сигнал Sig Quit в jvm. Как это работает на Windows, хотя? Это тот же процесс? Или есть другой механизм, который использует jstack, чтобы сообщить jvm для создания дампа потока? Аналогично, существуют ли определенные предварительные условия, необходимые для получения этого сигнала? Например, что если процесс достиг максимального предела количества дескрипторов для операционной системы Windows? Что если процесс достиг максимального количества сокетов?
Если это помогает, сам процесс также является стойким к прекращению, когда он входит в это проблемное состояние. Например, если я пытаюсь вручную завершить процесс из диспетчера задач Windows, я также получаю сообщение об ошибке "Отказано в доступе". В конечном итоге помогает только перезагрузка.
Я понимаю, что эти вопросы носят общий характер, но я пытаюсь понять весь рабочий процесс в дополнение к решению проблемы. Благодарю.