猿问

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

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

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

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


蓝山帝景
浏览 199回答 3
3回答

紫衣仙女

是的,线程转储和堆转储是 JDK 8 中的停止世界操作。HotSpot JVM 在全局安全点执行它们。有关详细信息,请参阅此答案和此答案。

PIPIONE

获取任何线程(即使只有一个线程)的堆栈跟踪都会将所有线程都置于安全点。你可以用每次因任何原因(不仅仅是 GC)停止 JVM 时,都会打印-XX:+PrintGCApplicationStoppedTime这将打印统计信息,包括停止的原因。-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1有一个计划引入一个线程特定的停止,但需要安全指向每个线程。jstack

ABOUTYOU

我认为在拍摄线程快照时,会有一个周期性的停止世界暂停。https://dzone.com/articles/logging-stop-world-pauses-jvm它不会改变传统意义上的线程状态。
随时随地看视频慕课网APP

相关分类

Java
我要回答