问题:多台服务其中有一台不能正常访问
首先查看系统资源占用信息,通过top命令看一下
发现正在运行的JAVA项目CPU占用率很高,百分之400左右了,那么问题一定出在这个程序中,第一感觉是代码有问题了,是不是某种条件下有死循环了,或者突然有什么地方出现了大量运算
然后由上面TOP可知进程ID为21501
再通过ps命令(Ps -mp pid -o THREAD,tid,time)查看这个程序的线程信息,tid代码线程ID,time代表这个线程的已运行时间
于是可以看到这个进程中有4个线程的CPU占用率很高,并且它们目前也运行了46分钟了,它们的TID分别为21515、21516、21517、21518
将这4个TID转为16进制,为等会在jstack中查找方便
得到这4个数的16进制为别为504b、504c、504d、504e
jstack查看进程信息
有了线程ID的16进制后,再在jstack中查看进程堆栈信息(之所有拿到TID信息,主要是为了查找方便)
从上面jstack中看,并没有我预期的jstack中的Class 正在运行,可能不是死循环,那么不妨将整个jstack保存,以防丢失现场数据。
现在的问题是gc高了,怎么办,还没有达到触发gc配置文件写dump的条件,那么值能jmap上了,一般情况下是直接先打印一个heap的使用情况,发现内存的新生代和老生代都满了特别是老生代99.98609224955241% used
以为是启动参数配置的问题,结果去查了发现并不是
#perm区大小 -XX:PermSize=256M
#最大perm区大小 -XX:MaxPermSize=512m
-Xms1024M -Xmx2048M
#最大可新生代分配大小 -XX:MaxNewSize=512m
最后通过jmap -histo:live 21501 |head -50查看内存使用情况,发现原来是导出问题所在