Останавливает ли запуск JStack на Java 8 все потоки? - PullRequest
3 голосов
/ 18 марта 2019

Я выполняю команду JStack для получения дампов потока через определенный интервал.

Я заметил, что всякий раз, когда выполняется JStack, все потоки в целевом процессе останавливаются. Я пришел к такому выводу, посмотрев журналы log4j 2, в которых не обнаружил журналов во время выполнения JStack.

Может кто-нибудь сказать мне, JSTack приостанавливает / останавливает все потоки в целевом процессе?

Ответы [ 3 ]

4 голосов
/ 18 марта 2019

Да, дамп потока и дамп кучи - это операции остановки мира в JDK 8.
HotSpot JVM выполняет их в глобальной безопасной точке.

См. это и это ответы для получения дополнительной информации.

3 голосов
/ 19 марта 2019

Взятие трассировки стека любого потока (даже одного) приводит все точки к безопасной точке. Вы можете увидеть это с

Печатается каждый раз, когда JVM останавливается по любой причине (не только GC)

-XX:+PrintGCApplicationStoppedTime

Печатает статистику, включая причину остановки.

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

Существует план ввести остановку, специфичную для потока, однако jstack необходимо указать точку для каждого потока.

0 голосов
/ 18 марта 2019

Я думаю, что при снимке потока будет периодическая пауза Stop-the-world.

https://dzone.com/articles/logging-stop-world-pauses-jvm

Это не меняет состояние потока втрадиционный смысл.

...