top命令结合jvm诊断工具jstack能够快速帮我们定位有问题的代码位置,输入top命令,运行图如下
CPU负载
第一行包括运行时间、当前时间、用户数量和系统平均负载,其中后面三个数字就是一分钟、五分钟和十五分钟到现在的系统负载的平均值;
第二行为任务信息:
信息栏第二行task
含义(进程状况)
total
进程总数
running
正在运行的进程数
sleeping
睡眠状态的进程数
stopped
停止的进程数
zmobie
僵尸进程数
第三行为CPU使用情况
CPU使用情况
含义(表示占用CPU的百分比)
us
User Time, CPU执行用户进程的百分比,包括Nice TIme
sy
System Time, CPU在内核运行百分比, 包括IRQ和softIRQ
ni
Nice Time, 调整进程优先级所用的百分比
id
Idle Time, 系统空闲百分比
wa
Waitting Time, CPU等待I/O完成所用百分比
hi
Hard IRQ Time, 硬中断占用CPU的百分比
si
Soft IRQ Time, 软中断占用CPU的百分比
st
Steal Time,虚拟服务占用
第四行:物理内存使用情况
KiB Mem
含义(内存使用信息)
total
总物理内存
free
空闲的物理内存
used
已使用的物理内存
buff/cache
缓冲区和缓存区占用内存的总量
这里区别一下buffers和cache,两者都是内存中存放的数据,区别在于buffers存放的是准备写入磁盘的数据,cache存放的是从磁盘中搂出来的数据,在Linux系统中会有一个守护线程,会定期的把buffers写入磁盘,这样可以把分散的I/O操作集合起来,减少了磁盘寻道的时间和磁盘碎片,cache是Linux把读取频率高的数据,放在内存中,减少I/O。Linux中cache没有固定大小,根据使用情况会自动的增加或者删除。
第五行::交换区使用情况
KiB Swap
交换区使用信息
total
交换区总量
free
未使用的
used
已使用的
avail Mem
可用的内存量
交换区是硬盘上的一块空间,在内存不足的情况下,操作系统把内存中不用的数据存在硬盘的交换区中,腾出内存让别的程序运行,因此开启swap会在一定程度上引起I/O效率的下降,像阿里服务器默认不开启
第六行:进程详细信息
进程详细信息
PID
进程id
USER
进程所有者的用户名
PR
优先级
NI
nice值
VIRT
进程使用的虚拟内存总量,单位kb
RES
进程使用的,未被换出的物理内存大小,单位kb
SHR
共享内存大小,单位kb
S
进程状态(D:不可中断的睡眠状态,R:运行,S:睡眠, T:跟踪/停止, Z:僵尸进程)
%CPU
上次跟新到现在的CPU时间占用比
%MEM
进程使用的物理内存百分比
TIME+
进程使用的CPU时间总计,单位1/100秒
COMMEND
命令名/命令行
top命令使用
-b:可以吧把top输出的内容以可读的形式写入文件,如top -b >> top.txt
-c:显示完整的命令行(COMMAND),想查看进程执行的具体位置时非常有用
-d:指定屏幕刷新时间间隔,如top -d 1表示每隔一秒刷新一次
-s:使用保密模式
-S:使用累计模式
-i:不显示任何闲置或者僵尸进程
-u:指定用户名
-p:指定进程号
-n:指定循环次数,到了次数自己退出
top命令交互式使用
i:忽略闲置线程和僵尸线程;
l:切换显示平均负载和启动时间信息;
m:切换显示内存信息;
t:切换显示进程和CPU状态信息;
c:切换显示命令名称和完整命令行;
M:根据驻留聂存大小进行排序;
P:根据CPU使用百分比进行排序;
T:根据时间进行排序;
常用命令:top -p H
查看每个线程详细信息
运用jvm诊断工具jstack可以获取线程的堆栈信息,根据这些线程堆栈信息可以去检查java程序出现问题的地方。