背景:近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下。
一、jstack使用方法
方法一
1.jps 获取Java进程的PID。
2.top -H -p PID 查看对应进程的哪个线程占用CPU过高。(可以使用ps -Lfp pid或ps -mp pid -o THREAD, tid, time或top -Hp pid)
3.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。(或者使用printf “%x\n” PID)
4.在第二步导出的Java.txt中查找转换成为16进制的线程ID。找到对应的线程栈。
5.jstack ‘线程ID’ >> java.txt 导出CPU占用高进程的线程栈。
6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。
root@ubuntu:/# jstack 21711 | grep 54ee
“PollIntervalRetrySchedulerThread” prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait() [0x00007f94c6eda000]
方法二
1.使用top 定位到占用CPU高的进程PID
top
通过ps aux | grep PID命令
2.获取线程信息,并找到占用CPU高的线程
ps -mp pid -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf “%x\n” tid
4.打印线程的堆栈信息
jstack pid |grep tid -A 30
说明:
jstack 查看某个Java进程内的线程堆栈信息
jstat 查看对内存回收情况
二、jstat (JVM统计监测工具)
jstat -gcutil pid 5s //每隔5s监控一次内存回收情况
E 代表 Eden 区使用率;
O(Old)代表老年代使用率 ;
P(Permanent)代表永久代使用率;
CCS 压缩使用比例
M 元空间(MetaspaceSize)已使用的占当前容量百分比
YGC(Young GC)代表Minor GC 次数;
YGCT代表Minor GC耗时;
FGC(Full GC)代表Full GC次数;
FGCT(Full GC)代表Full GC耗时;
GCT代表Minor & Full GC共计耗时。
三、jmap
用来查看堆内存使用状况,一般结合jhat使用。
https://www.cnblogs.com/baihuitestsoftware/articles/6382733.html
https://www.cnblogs.com/mlgjb/p/7991903.html
https://www.cnblogs.com/kongzhongqijing/articles/3630264.html