CPU占比持续高
1.分析哪个线程耗用CPU(看程序哪块逻辑消耗CPU)
找到Java进程pid:jcmd
监控Java进程状态:java -jar opt/arthas/arthas-boot.jar 7
进入后执行thread命令 查看TOP n 线程 ,返回的第一列未线程ID
/# thread
执行thread线程ID 查看线程堆栈,了解该线程正在执行什么代码,进而得知程序是在干什么比较耗用CPU
/# thread ID
CPU占比比较高时大多数情况都是GC线程耗用CPU,这时一般是程序有内存泄露问题,需要分析GC情况,若不是GC线程耗CPU,则可以根据线程堆栈了解程序时干什么事情很消耗CPU,可让研发结合实际运行情况分析原因(可在arthas中执行stop命令退出arthas命令)
2.分析内存GC问题(在K8s容器中执行的,非arthas里面)
总结垃圾回收统计
/# jstat -gcutil 7 5000
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
若FGC,FGCT增加的较快但持久化内存占用降低的很少,且总体呈上升趋势说明内存有泄露,需进一步分析内存中的对象,具体是什么对象持续增长
查看内存中对象信息写入到文件中
jmap -histo:live 进程pid > 输出文件名
/# jmap -histo:live 7 > dump4.txt
/# more dump4.txt
以上结果中展示了Java内存中各个对象的数量及占用的内存大小,持续跟踪多次,找到持续上涨的可疑对象,结合代码逻辑就可以分析出大概的问题代码块。