java应用可通过jvm参数开启安全点日志以排查stw问题:-xx:+printgcapplicationstoppedtime打印暂停时长;-xx:+printsafepointstatistics配合-xx:printsafepointstatisticscount=1输出详细统计;jdk9+推荐用-xlog:safepoint*。

Java 应用可以通过 JVM 参数开启安全点日志,用于观察应用在 GC、JIT 编译、线程停顿等场景下进入安全点的时机和耗时,对排查 STW(Stop-The-World)问题非常有用。
使用 -XX:+PrintGCApplicationStoppedTime 查看 STW 时长
该参数会打印每次应用线程因安全点而暂停的时间,格式简洁,适合快速定位明显卡顿:
- 输出示例:
Application time: 0.0012345 seconds(表示本次安全点暂停耗时) - 配合
-Xloggc:gc.log可将日志写入文件便于分析 - 适用于 JDK 8 及以上版本(JDK 9+ 推荐用统一日志框架)
使用 -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 获取详细统计
开启后 JVM 会在每次安全点事件后输出详细信息,包括触发原因、阻塞线程数、最长停顿线程等:
-
-XX:+PrintSafepointStatistics启用统计输出 -
-XX:PrintSafepointStatisticsCount=1表示每 1 次安全点都打印(设为 0 则只在 JVM 退出时汇总) - 典型输出包含:
vmop(触发操作类型,如ThreadDump、ParallelGCFailedAllocation)、threads(等待线程数)、time(进入安全点总耗时)
JDK 9+ 推荐使用统一日志框架(-Xlog)
JDK 9 引入了 -Xlog,更灵活且可过滤,替代旧参数:
- 启用安全点日志:
-Xlog:safepoint* - 只记录耗时较长的安全点(如 >10ms):
-Xlog:safepoint*=info,level=warning或结合uptime,tags格式化输出 - 输出到文件:
-Xlog:safepoint*:file=safepoint.log:uptime,tags:level
注意事项与常见误区
安全点日志本身有开销,生产环境建议按需开启、及时关闭:
- 避免同时开启过多日志选项(如
-XX:+PrintGCDetails+-XX:+PrintSafepointStatistics+-Xlog),可能互相干扰或重复输出 - 某些安全点事件(如偏向锁撤销)不会触发完整 STW,但会出现在 safepoint 日志中,需结合上下文判断影响
- 日志中显示“no vm operation”通常表示是定时轮询触发的安全点检查,非主动操作引起
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











