You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JVisualVM 2.0.5中CPU达100%时,如何执行脚本排查及优化处理?

问题解答

一、脚本排查该时段问题的可行性

完全可以通过脚本捕获异常时段的线程数据,针对你的场景有两种实现思路:

  • 定时触发脚本:如果能复现或预估问题发生时间,可利用系统定时任务配合jstack命令,在目标时段前后多次抓取线程转储,对比状态变化。Linux下示例:
    # 在13:00:10、13:00:15、13:00:20分别抓取线程转储到文件
    echo "jstack <你的Java进程PID> > thread_dump_130010.log" | at 13:00:10
    echo "jstack <你的Java进程PID> > thread_dump_130015.log" | at 13:00:15
    echo "jstack <你的Java进程PID> > thread_dump_130020.log" | at 13:00:20
    
  • 阈值触发脚本:用系统工具监控CPU使用率,当达到阈值(比如90%)时自动执行jstack甚至jmap(堆转储,按需使用)。Linux下示例片段:
    while true; do
      CPU_USAGE=$(top -b -n 1 -p <你的Java进程PID> | grep <你的Java进程PID> | awk '{print $9}')
      if (( $(echo "$CPU_USAGE > 90" | bc -l) )); then
        TIMESTAMP=$(date +%Y%m%d_%H%M%S)
        jstack <你的Java进程PID> > thread_dump_${TIMESTAMP}.log
        sleep 60 # 避免短时间重复生成文件
      fi
      sleep 5
    done
    
    这种方式适合无法预估问题发生时间的场景,能自动捕获异常数据。

二、更优处理方案

  1. 实时CPU采样分析:在JVisualVM中直接使用采样器的CPU采样功能,CPU飙升时立即启动采样,结束后可查看方法调用栈的耗时占比,快速定位热点方法——相比线程转储,采样能直观展示哪些方法持续占用CPU。
  2. 线程转储+采样结合:先抓线程转储筛选出处于RUNNABLE状态的线程,再对这些线程针对性采样,精准定位到具体代码行。
  3. 排查系统层面干扰:用top(Linux)或任务管理器(Windows)确认是Java进程本身占用CPU,还是系统其他进程导致。若确认是Java进程,再聚焦线程层面。
  4. 启用GC日志:如果CPU飙升伴随GC频繁,添加JVM参数-Xlog:gc*:file=gc.log:time,level启用GC日志,排查是否是Full GC或频繁Young GC引发的CPU占用。

三、JVisualVM实用插件推荐

  • VisualVM Sampler:增强版采样插件,支持更细粒度的CPU和内存采样,可导出采样报告方便后续分析。
  • Threads Inspector:直观展示线程状态、锁持有情况,支持对比多次线程转储的线程变化,快速定位阻塞或持续运行的线程。
  • GC Viewer:集成GC日志分析功能,在JVisualVM内直接查看GC趋势、停顿时间,判断是否为GC导致的CPU异常。

内容的提问来源于stack exchange,提问作者RAFJR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:58:29