工具: 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

线上环境,内存溢出了怎么办呀

更多内容请关注微信公众号:起点测试

posted on 2019-09-03 10:43  淡然~~浅笑  阅读(579)  评论(0编辑  收藏  举报