top命令结合jvm诊断工具jstack能够快速帮我们定位有问题的代码位置,输入top命令,运行图如下
第一行包括运行时间、当前时间、用户数量和系统平均负载,其中后面三个数字就是一分钟、五分钟和十五分钟到现在的系统负载的平均值;
- 第二行为任务信息:
信息栏第二行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 <pid> H
查看<pid>每个线程详细信息
运用jvm诊断工具jstack可以获取线程的堆栈信息,根据这些线程堆栈信息可以去检查java程序出现问题的地方。
网友评论