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

4

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

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

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

3个回答

6

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

更多信息请参见此答案此答案


4
获取任何线程的堆栈跟踪(即使只是一个)会将所有线程带到安全点。您可以通过以下方式查看:
每次JVM由于任何原因(不仅仅是GC)停止时都会打印此内容。
-XX:+PrintGCApplicationStoppedTime

这将打印统计数据,包括停止原因。

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接