定位Java应用的CPU飙升的原因

  • 首先,需要知道哪个进程占用CPU比较高,
  • 其次,需要知道占用CPU高的那个进程中的哪些线程占用CPU比较高,
  • 然后,需要知道这些线程的stack trace。

Top

image.png
然后使用top -H -p java进程号 命令得到当前进程使用cpu较高的线程。

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 — 进程名称(命令名/命令行)

记下使用cpu使用比较高的线程id(PID),
执行 jstack java进程号 >> 文件名.txt ,将进程线程使用情况输出到文件内

把记下的线程id转成16进制,去线程堆栈里面找,可以看到当前线程在干嘛。
然后在继续排查,具体原因是因为什么。当时我遇见的情况是gc一直再执行,而且内存也超了。一步步排查,确定是转化文档出问题,一个excel文档内有上百万空表格。对他进行了一个限制。然后就没再出过问题。

java问题排查
https://www.jianshu.com/p/b6384b25680b