java项目cpu或内存过高,排查问题思路
一、cpu过高
1、通过top命令,定位进程ID
通过top命令,查看CPU使用率最高得进程ID,记为@pid
2、通过韩参数得top查看cpu过高线程
命令 top -H -p [@pid]
,记录结果得pid值,记为@tpid
3、通过printf 打印上述值得十六进制
命令 printf 'ox%x\n' [@tpid]
,记录结果为@tid
4、jstack命令查看线性具体信息
命令jstack [@pid] | grep [@tid]
,可以查看线程具体信息,再进行详细定位
二、内存过高
1、top查看较高得进程
top命令可以查看cpu,内存等信息,记录进程ID为@pid
2、jstat查看垃圾回收情况
命令jstat -gc [@pid] 1000
查看GC情况,1000表示1秒刷新一次
S0C:第一个幸存区的大小,单位KB。
S1C:第二个幸存区的大小。
S0U:第一个幸存区的使用大小。
S1U:第二个幸存区的使用大小。
EC:伊甸园区的大小。
EU:伊甸园区的使用大小。
OC:老年代大小。
OU:老年代使用大小。
MC:方法区大小(元空间)。
MU:方法区使用大小。
CCSC:压缩类空间大小。
CCSU:压缩类空间使用大小。
YGC:年轻代垃圾回收次数。
YGCT:年轻代垃圾回收消耗时间,单位s。
FGC:老年代垃圾回收次数。
FGCT:老年代垃圾回收消耗时间,单位s。
GCT:垃圾回收消耗总时间,单位s。
如果gc频繁,每次回收内存空间也正常,那么说明是因为对象创建过快导致内存一直占用很高;如果每次回收的内存非常少,那么有可能是因为内存泄漏导致内存一直无法被回收。
3、jmap查看对象占用内存情况
命令jmap -histo [@pid] | head 20
查看前20个大对象
4、jmap到处dump文件
如果第三步查不出来,可以将dump文件导出,并通过visualVM 工具打开分析,命令 jmap -dump:live,file=/home/my.hprof
导出dump文件
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!
------愿来生只做陌上的看花人,无须入尘缘,仅行于陌上,看一川风花,无爱无伤-----