1.top基本使用服务器
top 命令运行图:架构
第一行:基本信息ide
第二行:任务信息工具
第三行:CPU使用状况oop
第四行:物理内存使用状况性能
buff/cache:操作系统
buffers 和 cache 都是内存中存放的数据,不一样的是,buffers 存放的是准备写入磁盘的数据,而 cache 存放的是从磁盘中读取的数据 线程
在Linux系统中,有一个守护进程(daemon)会按期把buffers中的数据写入的磁盘,也可使用 sync 命令手动把buffers中的数据写入磁盘。使用buffers能够把分散的 I/O 操做集中起来,减小了磁盘寻道的时间和磁盘碎片。blog
cache是Linux把读取频率高的数据,放到内存中,减小I/O。Linux中cache没有固定大小,根据使用状况自动增长或删除。进程
第五行:交换区使用状况
Swap(内存交换区):
是硬盘上的一块空间。在内存不足的状况下,操做系统把内存中不用的数据存到硬盘的交换区,腾出内存来让别的程序运行。所以,开启swap会必定程度的引发 I/O 性能降低(阿里服务器默认不开)
第六行:进程详细信息
2.死循环
构造的代码以下:
.
这里只介绍一下用到的top参数
先手动制造CPU飙高的场景,多执行几回,小编这里执行3次
执行top
jstack命令工具能够获得线程堆栈信息,根据这些线程堆栈信息,咱们能够去检查Java程序出现的问题
看到pid为23757的进程CPU占用较高,执行以下命令
看看pid为23757的进程中线程的具体状况
固然你也可使用交互命令
而后再输入H,效果和上面同样
能够看到PID为23772,23773和23774的线程占用CPU较高
这里可能有人有疑惑,为何线程也有PID啊?其实线程进程都会有本身的ID,这个ID就叫作PID,PID是不特指进程ID,线程ID也能够叫作PID
将10进制的23772转为16进制,由于jstack中PID用的是16进制
打开loop.txt文件,搜5cdc
能够看到线程一直在执行ShowTopController中的第23行,即
好了定位到代码中的位置了,固然生产环境中确定不会写一个死循环的,有可能在特殊场景下出现死循环,或执行一个方法特别慢,用这种方法很快就能找到代码位置。
3.死锁
接着访问
执行
打开loop.txt文件到最后
看到发现一个死锁,死锁代码的位置描述的很清楚,生产环境发生的死锁固然没有这么简单,全部学会用这些命令排查仍是颇有必要的
Java架构:https://blog.51cto.com/13732225/2347907