出现问题的原因
一种是由计算导致的CPU使用过高,一种是由内存不足,频繁垃圾回收导致的CPU使用过高。
- 线程太多,上下文不停切换,比如大量线程激烈的锁竞争,线程不停阻塞恢复阻塞。或者产生死锁
- 项目出现死循环,比如hashmap并发场景下的死循环
- 频繁发生FULL GC
排查步骤
-
执行 top 命令,在linux系统上显示系统各个进程的资源占用状态,找到占用率很高的进程ID 1024
-
执行 top -p 1024 -H 命令,查看当前进程下的所有线程信息,找到占用率很高的线程ID 2048,将ID转换成16进制得到800
-
执行 jstack 1024> thread_stack.log 将进程的堆栈信息写入到文件中
-
在thread_stack.log根据找到800对应的堆栈信息,根据堆栈信息定位到代码位置
-
如果线程为GC线程(VM Thread),使用 jmap -histo> jmap.log 输出java堆中对象的统计信息,可能不停创建大对象,导致频繁GC导致CPU占用很高。或者使用jmap导出dump日志,使用mat工具查看,如果内存使用率不高,但FULL GC频繁,可能是手动调用System.gc()导致的。
大约 2 分钟