一:
jps -l可以查到服务的进程号
top -c ,显示进程运行信息列表。然后键入P (大写p),进程按照CPU使用率排序
二:
top -H -p $pid,可以看到进程中具体是哪个线程占用了CPU,记下该线程的id
三:
使用 jstack pid > /tmp/log.txt 命令查看线程堆栈信息
四:
根据线程id 查询在日志文件中,查看堆栈信息
(由于堆栈日志 线程id是16进制的,所以需要先将10进制的线程id转为16进制)
printf “%x\n” 线程PID,可得到对应数字的十六进制
根据关键词:nid=0x48a7 搜索日志
jmap打印详细heap信息。
现场处理
服务现场已知CPU占用暴增的服务为哪个。针对具体服务进行处理。
jstack 32856 > /cloud//stack.txt 打印堆栈信息到指定文件中。
查看具体heap信息
jmap -dump:live,format=b,file=/cloud/Programs/log/jamp.hprof 32856
使用java的jdk下的jvisualvm.exe查看hprof 文件后发现String,long,Map数据占用内存很高。
如果报连接soket失败,可能是进程用户不一致问题。使用 su 账户名 切换到对应账号执行命令。
经排查代码后发现此是一个用来记录每条数据处理时间的Map<String,long>的数据。只做了数据打印,无其他特别使用。去掉后,程序正常。