java应用cpu占用过高排查

top命令得到pid


相关字段解释:

  • PID — 进程id
  • USER — 进程所有者
  • PR — 进程优先级
  • NI — nice值。负值表示高优先级,正值表示低优先级
  • VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  • RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
  • SHR — 共享内存大小,单位kb
  • S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
  • %CPU — 上次更新到现在的CPU时间占用百分比
  • %MEM — 进程使用的物理内存百分比
  • TIME+ — 进程使用的CPU时间总计,单位1/100秒
  • COMMAND — 进程名称(命令名/命令行)

top -Hp 获取CPU占用高的线程

top -H -p 84694含义:

  • -H 指显示线程
  • -p 是指定进程

84694是第一步得到的进程的pid。
通过该命令可以查看该进程里面的线程的cpu占用情况。

可以看到84858的线程占cpu高达75.7%。

jstack获取jvm线程堆栈

jstack用于生成jvm当前时刻的线程快照。线程快照是当前jvm内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

#84694是导致CPU占用高的进程号
sudo jstack -F  84694 > stack.txt
#84858是导致CPU占用高的进程的线程号
cat stack.txt | grep -A 10 84858

现在已经找到了导致cpu高的线程执行的代码行,通过分析具体代码即可知道原因。就本例而言,该线程正在等待写锁,说明是IO压力导致的CPU高,可以进一步通过iostat分析验证。

# java 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×