运行 java 8 上的 JStack 会停止所有线程吗?

Does running JStack on java 8 stops all threads?

我正在执行 JStack 命令以在特定时间间隔获取线程转储。

我观察到每当 JStack 执行时,目标进程上的所有线程都会停止。在查看我的 log4j 2 日志后,我得出了这个结论,我发现在 JStack 运行期间没有日志记录。

有人能告诉我 JSTack suspends/stops 目标进程中的所有线程吗?

我认为拍摄线程快照时会出现周期性的 Stop-the-world 暂停。

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

它不是改变传统意义上的线程状态。

是的,线程转储和堆转储是 JDK 8 中的 stop-the-world 操作。
HotSpot JVM 在全局安全点执行它们。

有关详细信息,请参阅 this and this 个答案。

获取任何线程(即使只有一个线程)的堆栈跟踪会将所有线程带到安全点。你可以用

看到这个

每次 JVM 因任何原因(不仅仅是 GC)停止时都会打印

-XX:+PrintGCApplicationStoppedTime

这会打印包括停止原因在内的统计信息。

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

有计划引入特定于线程的停止,但是 jstack 需要为每个线程设置安全点。