借用汤师爷的一句话:“麻匪一定要缴———没有麻匪的日子才是好日子”。
作为程序员,bug一定是要处理的,没有bug的日子才是好日子!你想想,你正吃着火锅唱着歌,突然收到生产环境异常,急需处理的通知,这火锅还怎么吃,歌还怎么唱。
今天就来聊聊突然收到Java项目服务器CPU过高我们如何处理。
1 先查看服务器上的进程CPU使用情况
[root@pro ~]# top
2、使用ps 查看某个进程中的CPU占用情况:top -Hp <pid>
[root@pro ~]# top -Hp 14937
3、使用 jstack 获取线程快照并输出到某个文件中: jstack -l <pid> > ./<file>
其中pid,我们查到的是10进制数,需要转为16进制数: printf "%x\n" <pid>
[root@pro ~]# printf "%x\n" 8375
20b7
由于16进制以0x开头,所以我们应该在转换的线程号前添加0x, 则最终pid 为 0x20b7,然后获取线程快照
[root@pro ~]# jstack -l 0x20b7 > ./8375.txt
4、jstack 命令格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
其中最常用的是: jstack [ option ] pid ,option 参数说明如下:
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
-l | 除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 |