工具: jstack + top 命令
排查思路:1)找出占用高的进程 2)找出占用高的线程 3)找出具体的代码
步骤:
1)使用top命令找出进程
--执行“top -c”命令,显示进程运行信息列表,键入大写P,按CPU使用率降序排列
如下图所示:找出了进程编号:11098 的进程,占用cpu较高
2) 找出线程
--执行命令: top -Hp 进程编号 ,显示出该进程下的线程列表,然后键入大写P后,按CPU使用率降序排列
-- top –Hp 11098 , 找出了线程编号为:11569
3) 找出线程对应的代码
--执行:printf “%x\n” 11569 ,得出16进制:2d31(转为16进制,是因为jstack打印出的线程栈信息中,线程id是通过16进制展示的 )
--执行: jstack 11098 | grep “2d31” -C5 –color,这样就找到具体的代码
--关于线程名的问题,如果在程序里面自己开了线程or线程池,最好取个识别度高的名字
工具: jmap + jstat + mat
排查思路:1) 检查jvm内存的分配情况 2) 检查jvm的gc情况 3)找出占用量比较大的对象
步骤:
1) 查看jvm内存分配及使用情况
---通过命令 jmap –heap 进程id (目的是确定内存分配是否正确,以及jvm中内存的实时状态)
--- jmap -heap 23740
2) Jstat命令检查jvm的gc情况
---执行: jstat -gcutil 23740 1000
3) Jmap命令找出占用量比较大的对象
---执行: jmap -histo:live 23740 |more
更多内容请关注微信公众号:起点测试