一、问题详情
现象:API接口访问耗时过长,排查发现当前节点内存使用3.9G,CPU占用率295%。
当前节点已两周没发版,怀疑内存没有释放,可能是JVM垃圾回收的问题。
二、排查过程
1、定位问题进程
进入服务器,执行TOP命令:top
发现pid为1820的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8%。
2、定位问题线程
查看该进程的线程情况,执行命令:ps -mp pid -o THREAD,tid,time
发现该进程的TID为1820的线程占用率很高
3、查看问题线程堆栈
挑选TID为1820的线程,查看该线程的堆栈情况,
先将线程id转为16进制,执行转换命令:printf “%x\n” tid
4、查看进程的内存情况
执行命令:jstat -gcutil pid period(间隔时间) times(打印次数)
5、打印线程堆栈信息
执行jstack命令:jstack pid |grep tid -A 30
6、输出异常堆栈日志文件
执行jstat命令:jstat pid>> jstat.out
7、定位日志
"http-nio-8765-exec-1