问题描述
项目部署虚拟机内存达到阈值,触发告警,排查项目堆栈内存大小,是否是Java内存过高?过高原因是什么?查看对象数量、及GC次数等等
原因分析:
经过top命令查看到Java进程占用内存较大,考虑是程序引发告警,进一步排查jvm信息
排查手段 | 命令 |
---|---|
定位到CPU/内存高的进程 | top |
跟进PID找到占用CPU/内存高的线程id | top -Hp PID |
将需要的线程ID转换成16进制格式 | print “%x\n” tid |
打印线程的堆栈信息 | jstack PID |
查看gc time等信息 | jstat -gcutil PID 1000 100 > /tmp/gctime.log |
查看对象大小数目 | jmap -histo:live PID > /tmp/histo.log |
dump内存 | jmap -dump:live,format=b,file=/tmp/dump.hprof PID |
虚拟内存统计 | vmstat 5 10 > /tmp/vmstat.log |
注意:jmap命令慎用,可能会引起进程死掉,其中 -histo:live会触发FGC