1. CPU占用过高问题定位
step1: 定位问题进程
使用top命令查看资源占用情况,找占用大量的CPU资源的进程的pid;
step2: 定位问题线程
使用ps -mp <pid> -o THREAD,tid,time命令查看该进程的线程情况,发现该进程的多个线程占用率很高
step3: 查看问题线程堆栈
(1) 挑选指定TID的线程,查看该线程的堆栈情况,先将线程id转为16进制,使用printf “%x\n” tid命令进行转换
(2) 再使用jstack命令打印线程堆栈信息,命令格式:jstack <pid> | grep <tid> -A 30
如果线程是JVM的gc线程。则可以基本确定是内存不足或内存泄露导致gc线程持续运行,导致CPU占用过高。
所以接下来要找内存方面的问题
2. 内存定位问题
1、使用jstat -gcutil命令查看进程的内存情况
jstat -gcutil <PID> 2000 10
2、 jstat <PID> >>jstat.out
把jstat.out文件从服务器拿到本地后,用编辑器查找带有 项目目录 并且 线程状态是RUNABLE 的相关信息
就可以定位到具体代码是哪一文件的哪一行
====================================
1.linux下 top 命令查询查询消耗cpu最高的进程id
2. 将进程信息导出到日志文件中 ./jstack 进程id >stack.log
3.查询进程id下消耗cpu最高的线程id top -Hp 进程id 线程id对应此进程id
4. cat stack.log | grep 线程id16进制数
5.jstack命令在jdk安装目录下
6. ./jmap -histo pid 查看进程内存情况 -histo 打印每个class的实例数目,内存占用,类全名信息.
7. ./jstat -gcutil pid 5000 2 每隔5s,总共2次,查询进程id 垃圾回收情况,