【JAVA核心知识】top,jstack,jps,jmap排查CPU和OOM问题

top命令查看进程资源信息

top命令类似于windows的任务管理器,通过这个可以看到系统中各个进程的资源占用状况,常用于服务端性能分析。
语法格式:top [参数], 按q退出命令,一般不需要加参数,直接top就行
常用参数

  • -d:改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
  • -q:没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
  • -c:切换显示模式
  • -s:安全模式,将交谈式指令取消, 避免潜在的危机
  • -i:不显示任何闲置 (idle) 或无用 (zombie) 的行程
  • -n:更新的次数,完成后将会退出 top
  • -b:批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内

显示解释
在这里插入图片描述
第一行:

  • 16:43:14 - 当前时间
  • 2 days 21:40 - 系统已运行了 2天21小时40分钟
  • 2 user - 当前系统有2个用户
  • load average: 0.07 0.03 0.00 - load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

第二行:

  • 当前系统任务(进程)状态 : 系统当前有27个线程,1个运行中,26个休眠中, 0个stop, 0个僵尸线程

第三行:cpu的使用状态,默认是总计,按“1”则会显示每个CPU的状态

  • 2.7 us - 用户进程占用的CPU百分比
  • 0.0 sy - 内核进程占用的CPU百分比
  • 0.0 ni - 改变过线程优先级的进程占用的CPU百分比
  • 97.3 id - 空闲CPU百分比
  • 0.0 wa - IO等待占用的CPU百分比
  • 0.0 hi - 硬中断占用的CPU百分比
  • 0.0 st - 虚拟CPU等待实际CPU的百分比

第四行:内存的使用状态,这一行的判定要集合第五行

  • 2097152 total - 物理内存总量
  • 1053012 free - 空闲的内存总量
  • 483296 used - 使用中的内存总量
  • 560844 buff/cache - 缓存占用的内存总量

第五行: 交换分区状态
关于内存要提一下,不要用windows的内存概念去理解linux的,第四行的free如果极其小,在windows的看了是内存不足的情况,属于风险,但是在linux则不是,linux内存的free和used不是用是否使用而区分的,而是用是否分配而区分的,如果free很小,那只能说明现在只剩下很小的内存没有被分配出去,并不代表内存的使用已经处于紧张状态了。linux对分配到的内存,即使不使用也不会主动的交还给free。 而第五行的swap则可以辅助来判定内存状态,如果进程内存不足,那么就需要内存交换进行重新分配,如果swap频繁变化说明那么就说明在频繁交换,此时才表示是真的有内存不足的情况了。

第六行:空行

第七行:

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

第七行除了以上这些,可以通过按f键进入选择界面,添加更多的显示维度,带“*”的表示选中,高亮到指定维度,按d键切换开/关, 这个界面按q键或者Esc键退出。
在这里插入图片描述
在top命令界面,可以通过按’P’键(大写的哦,无论是用shift+p还是开启大写锁定,总之要大写)让进程按照CPU占用排序,或者通过按‘M’键(同样是大写)让进程信息按照内存占用排序。如果想选用其他列排序,可以先按f键进行列管理界面,选择要排序的基准列,按‘s’键,然后按’q’键退出就完成了。

top命令查看线程资源信息

通过top命令,可以看到哪个进程占用的CPU或者内存比较高,此时还可以通过top命令查看此进程内线程的资源占用情况:此时需要H和p两个参数:

  • p :通过指定进程ID(PID) 来仅仅监控某个进程的状态,可以指定多个(-p pid1 -p pid2 …)
  • H :注意大写哦,linux大小写敏感。显示进程内线程的状态指标,添加此参数显示维度就成为了线程

一般这两个参数都是结合起来使用:如 top - Hp 1183 就显示PID为1183的线程状态信息,和进程级别的信息差不多,不过此时PID就是线程的PID,而不是进程的PID了。
在这里插入图片描述

jstack命令进行分析

top命令属于linux命令, jstack是属于JVM的命令,如果要排查CPU占用问题,通过线程级别的top信息,按‘P’键通过CPU排序,就可以看到到底是哪个线程占用CPU较多,此时就可以通过jstack查看线程堆栈进行分析。
使用方式:jstack 进程的PID | grep 线程的PID的16进制形式 -A 显示的行数
使用jstack时要注意,jstack需要使用与进程一致的用户,比如我这里,进程的所有用户是jbossuser,那我就要登录jbossuser这个用户执行jstack命令,否则就会报错。
grep后面的纯粹就是起一个过滤作用,因为jstack显示的进程级别的堆栈,如果直接使用jstack 进程的PID就会看到密密麻麻的一大片,不方便排查指定线程,所以这里用grep做一下过滤,过滤指定的线程PID需要注意转成16进制形式,因为在堆栈中线程的PID以16进制形式显示。 因为单纯的grep之后显示命中的那一行,所以用-A指定行数,现在命中行后的一些数据以便看完整的堆栈。如这里我看线程2154的堆栈信息:2154的16进制是 86a
在这里插入图片描述
这里只打出来了10行,很明显信息不完整,此时可以调整显示行数,重新拉取。通过堆栈信息就可以看到线程现在在干什么,就可以排查为什么CPU占用率高了。

当然有时间需要把堆栈信息输出到一个文件里面,然后用TMDA 这样的工具分析,那么此时就可以用:jstack 1183 > dump.txt 输出到文件,然后把这个文件下载下来就可以了。 文件可指定输出目录,如果不指定路径,那么就默认输出到当前目录下。如果不知道当前目录是什么,可以通过pwd命令来获取。

jps命令获得java线程

ps命令是“process status”的缩写,ps命令用于显示当前系统的进程状态。通过ps -ef | grep java 就可以大概获得当前应用中的java进程,只是大概的原因是用java关键字做的过滤,不能保证其他进行一定不包含这个关键词。ps是linux的命令,JVM也提供了jps命令用来更好的进行JVM运维,jps命令用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态。相当于ps的子集,更加精准。

如果碰到一些情况,可以用ctrl+D退出命令

jmap排查OOM

如果线上出现OOM的问题,那么可以通过jmap命令来进行排查。

  • jmap -dump:live,format=b,file=xxx.hprof [pid] : 这个命令会将整个heap的信息dump写入到hprof 文件,heap越大耗时就越长,而且执行的过程中为了保证dump的信息是可靠的,会暂停应用, 这一点在使用时一定要考虑到。live是可选参数,加上表示只获取存活对象。此外可以通过JVM参数在发生OOM时自动生成hprof文件

    -XX:+HeapDumpOnOutOfMemoryError(开启堆快照)
    -XX:HeapDumpPath=C:/xxx.hprof(保存文件到哪个目录)
    

    获得hprof 文件后,就可以使用堆内存分析文件进行内存分析,看到底是哪些对象占据了内存进行排查。内存分析工具可以使用MemoryAnalyzer或者jha,这些工具会告诉你内存对象的占用比例,通过这些就可以分析OOM的成因。

  • jmap -histo:live pid :打印当前每个class的实例数目,内存占用,类全名信息. JVM的内部类名字开头会加上前缀”*”. live是可选参数,加上后只统计活的对象数量。采用jmap -histo:live pid>xxx.log日志将其保存,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。

  • jmap -heap [pid] : 展示堆的概要信息,包括使用的GC算法,堆配置信息,各内存区域的使用情况。

开发中常用的基础linux命令可以移步开发常用的linux命令整理
更多的JDK内置命令使用可以查看JDK内置工具使用,这篇博文列举的很清楚,如下:
在这里插入图片描述

参考资料:
JDK内置工具使用
Linux命令大全(手册)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yue_hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值