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内存中各个对象的数量及占用的内存大小,持续跟踪多次,找到持续上涨的可疑对象,结合代码逻辑就可以分析出大概的问题代码块。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐