首页 > 技术文章 > 线上问题排查方法

xiayangy 2015-12-09 20:13 原文

  • 线上服务器偶尔会因为程序问题导致报警,下面的方法可以有效的进行现场跟踪和问题排查:

具体步骤

1、查找进程号:jps
2、创建堆栈文件: touch jstack.txt
3、文件赋权chmod 777 jstack.txt
jstack PID > jstack.txt 
4、找出占用cpu最高的线程:(top -H -p PID)
5、将线程id转换成16进制 echo “obase=16;ID” | bc
6、在jstack.txt文件中查找对应的线程,寻找蛛丝马迹。
7、如有必要也可查看内存数据对象:
jmap -dump:format=b,file=/home/user/dumfile1,live PID
 

实例现场

一次线上服务器不断的进行full GC ,而且时间GC时间很长都在10s以上,cpu占用都在100%左右,
按照上面的步骤得到对应的线程堆栈文件和占用cpu最高的线程:
对应的线程信息
 

结论

从上述可以看出是系统在不断的进行GC,(java程序cpu占用100%,都是因为内存不够用了,但是GC又回收不了(socket/线程之类资源未释放、全局list或map之类),所以导致GC一直执行回收)
通过堆栈,当时应用业务代码正在大量的list执行fastjson的数据模型抓换,并且是多个线程同时执行,最终导致了这个问题;后来采取降低执行线程数,单线程处理,避免了这个问题的再次发生。
 
 
 
 
 
 

推荐阅读