运行 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
需要为每个线程设置安全点。
我正在执行 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
需要为每个线程设置安全点。