cpu使用率问题

1. 在服务器上执行top命令确定是否是java进程导致的cpu过高

2. 定位到了进程之后 定位哪个线程导致的cpu过高 执行top -Hp pid 查看进程中线程的cpu占用率

3. 定位代码 jstack 进程id |grep -A 200 线程pid(pid是16进制数)

如果是正常的用户线程:

通过堆栈信息查看问题发生的类和代码地址

如果是vm线程:

使用jstat -gcutil <pid> <period> <times> 命令对比多次gc情况 如果频繁fullgc 则使用jmap dump:format=b,file=<filepath> <pid>命令 导出线程的内存占比情况

使用工具分析引用链信息,定位到类和代码位置

 

如果内存占比不高,cpu占比也不高

1. 程序慢并且不是必现情况,压测查看jstack堆栈信息排查阻塞点 是time wait condition等网络问题还是 blocked问题

2. 如果某个程序处于停滞状态,可以多次导出jstack堆栈信息 ,grep 定位出是哪个线程一直处于blocked状态,一般线程不会阻塞20s以上,分析堆栈情况查明问题

3. 死锁w

 

 

内存占比问题

1. 通过日志查看是元空间导致的permgen space还是堆栈异常Java heap space

2. 如果是元空间溢出一般是服务启动时加载了过多的jar包

3. top命令查看内存占比高的进程pid

4. jmap -histo:live [pid] 查看内存占用情况