在Java 8上运行JStack是否会停止所有线程?

时间:2019-03-18 13:39:08

标签: java java-8 jvm jvm-hotspot jstack

我正在执行JStack命令以按一定间隔进行线程转储。

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

有人可以告诉我JSTack是否挂起/停止目标进程中的所有线程吗?

3 个答案:

答案 0 :(得分:4)

是的,线程转储和堆转储是JDK 8中的世界停止操作。
HotSpot JVM在全局安全点执行它们。

有关更多信息,请参见thisthis答案。

答案 1 :(得分:3)

获取任何线程(甚至只有一个)的堆栈跟踪都会使所有线程到达安全点。您可以使用

查看

每次由于某种原因(不仅是GC)而停止JVM时,都会打印一次

-XX:+PrintGCApplicationStoppedTime

这将打印包括停止原因的统计信息。

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

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

答案 2 :(得分:0)

我认为在获取线程快照时会有一个周期性的世界暂停。

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

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