java-cpu/内存使用率过高问题排查
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] 查看内存占用情况