1.首先top查看进程列表,查找cpu占用率很高的进程
top
15088
2.然后再通过ps命令查看这个程序的线程信息,tid代码线程ID,time代表这个线程的已运行时间
ps -mp 15088 -o THREAD,tid,time
3.进制转换,3b4c
再将这3个TID转为16进制,为等会在jstack中查找方便
printf "%x\n" 15180
15180 3b4c
- jstack查看线程信息
whereis java
./jstack 15088 |grep 3b4c
5.jstack 存储堆栈详细信息,定位到具体的代码问题
./jstack 15088 >> /home/admin/15088.txt
总结:
最后,总结下排查CPU故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
-
jmap -histo pid >>jmap.log
打印此刻,堆 内存中所有的对象 和 数量 (jmap.log 默认没带时间戳),可以在内存占用高的时候看是否存在内存泄漏,可以看到某个对象是否过多。
jmap -histo pid|head -n 10
查看前十位,对象和数量 -
jmap -heap pid
来打印堆的存储情况
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 3221225472 (3072.0MB)
NewSize = 268435456 (256.0MB)
MaxNewSize = 268435456 (256.0MB)
OldSize = 2952790016 (2816.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 241631232 (230.4375MB)
used = 218613656 (208.4862289428711MB)
free = 23017576 (21.951271057128906MB)
90.47408904491287% used
Eden Space:
capacity = 214827008 (204.875MB)
used = 211860512 (202.04592895507812MB)
free = 2966496 (2.829071044921875MB)
98.61912334598078% used
From Space:
capacity = 26804224 (25.5625MB)
used = 6753144 (6.440299987792969MB)
free = 20051080 (19.12220001220703MB)
25.194327580608192% used
To Space:
capacity = 26804224 (25.5625MB)
used = 0 (0.0MB)
free = 26804224 (25.5625MB)
0.0% used
concurrent mark-sweep generation:
capacity = 2952790016 (2816.0MB)
used = 98283536 (93.73048400878906MB)
free = 2854506480 (2722.269515991211MB)
3.328497301448475% used
jstat命令详情:https://blog.youkuaiyun.com/zhaozheng7758/article/details/8623549