• 🏡
    首页
  • 📎
    归档
  • ✍
    日志
  • 🐂
    留言板
顶 峰 相 见
顶 峰 相 见

dfxj

各自努力,顶峰相见

06月
13
java

java应用cpu占用过高排查

发表于 2020-06-13 • 被 330 人看爆

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分析验证。

分享到:
Centos7安装Docker脚本
Java类加载机制及自定义加载器
  • 文章目录
  • 站点概览
dfxj

trade what you see, not what you think

Github QQ Email RSS
看爆 Top5
  • 金融交易技术分析 1,239次看爆
  • Angular 变更检测 —— 它到底是如何工作的? 1,207次看爆
  • kubernetes低版本java客户端ProcessorListener容量问题 1,111次看爆
  • Angular SSR踩坑记录 1,071次看爆
  • kubernetes容器编排和调度管理 1,007次看爆

站点已萌萌哒运行 00 天 00 小时 00 分 00 秒(●'◡'●)ノ♥

Copyright © 2021 dfxj