Привет, последние пару дней я работал над проблемой, из-за которой процесс Java иногда становился слишком медленным и не отвечал, а через некоторое время возвращался в нормальное состояние.

Итак, я сделал несколько дампов потоков, и все было в порядке. Тупика не было. Поскольку проблема возникала в производственной среде, я не должен был подключать какие-либо инструменты мониторинга JVM, такие как VisualVM. Кроме того, эти инструменты работают как отдельное приложение, поэтому они не могут отслеживать состояние потока с точностью до микро / наносекунд. При переключении контекста на уровне ЦП для этого (контролирующего) приложения я теряю информацию, относящуюся к любым изменениям, которые претерпела JVM.

Вы можете видеть, что из прикрепленного примера дампа потока Thread-1 находится в спящем режиме. Но я не знаю, как долго? и каково было его предыдущее состояние?

По сути, я хотел знать, что делает каждый поток, до того момента, пока я не возьму дамп потока. Был ли он запущен, заблокирован, ждал? Если да, то как долго? Итак, я подумал, что, если я заставлю каждый поток Java отслеживать свое собственное состояние. Такого уровня точности я не добьюсь ни от одного другого инструмента.

Итак, я загрузил исходный код Java с открытым исходным кодом с (https://hg.openjdk.java.net/jdk8). Затем я создал настраиваемую структуру для хранения информации и назвал ее threadStateInfo.cpp. Этот класс будет хранить предыдущее состояние и то, как долго оно находилось в этом состоянии. Когда состояние собственного потока изменяется, вызывается функция update_stat (), которая обновляет информацию. Функция print_stateInfo () выгружает информацию.

Мне нужно, чтобы каждый поток сохранял указанную выше информацию. Таким образом, модифицированный файл «runtime / osThread.hpp» отвечает за создание собственного потока ОС для каждого потока Java. Когда собственный поток хочет изменить свое состояние, вызывается функция «set_state ()». Поэтому я изменил эту функцию, которая будет сохранять состояние, а затем вызывать «update_stat ()».

Итак, с этими изменениями я создал код, а затем после запуска моей программы. Бум, я получил нужную информацию из дампа потока.

Благодаря этому я смог выяснить, что делал поток, сколько времени он провел в каждом состоянии и каково было его предыдущее состояние. Это помогло мне легко устранить проблему с медлительностью.