借助工具解决java进程高负载问题

背景:近期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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值