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

问题描述 投票:3回答:3

我正在执行JStack命令以在某个时间间隔内进行线程转储。

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

有人能告诉我JSTack是否暂停/停止目标进程中的所有线程?

java java-8 jvm jvm-hotspot jstack
3个回答
3
投票

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

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

-XX:+PrintGCApplicationStoppedTime

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

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

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


4
投票

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

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


0
投票

我认为在拍摄线程快照时会有一个周期性的Stop-the-world暂停。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.