乐趣区

Java进程CPU占用率100%问题排查

100% 指的是占用了 CPU 一个核心,两个核心是 200%,以此类推。CPU 占用率及对应进程 ID(pid)可以通过 top 命令确定,在 top 界面按 c(显示完整的命令行参数),按 1(显示每个核心的统计数据)。
这个问题最常见的有以下几种可能:
1、堆内存不足导致频繁 Full GC 可以通过两个命令确定
sudo jmap -heap pid 查看堆内存的消耗情况
sudo jstat -gc pid interval count 查看 GC 情况,示例:sudo jstat -gc 5746 3000 5 代表查看 5746 进程的 GC 情况、每隔 3000 毫秒打印一次、总共打印 5 次。如果 FGC/FGCT 增长明显,说明 Full GC 很频繁。
后续处理:

如果情况紧急,那得马上重启 Java 应用进程
不紧急的话需要获取相关信息用于分析为什么堆内存被消耗完了,可能有内存泄漏问题,可以用 1)sudo jmap -histo pid | head -n 20 查看 Java 对象的占用统计信息,2)sudo jmap -dump:live,format=b,file=heap.bin pid 把堆转储导出到本地文件,可以用 Eclipse MAT 工具分析内存泄漏

2、代码实现问题思路:追查具体是哪个线程占用了 CPU,1)先查到本地系统 CPU 占用率高的线程 ID,2)找到对应的 Java 线程及线程堆栈
top -H -p pid 查看某个进程里面哪些线程占用了 CPU,把对应的线程 ID 拷贝下来,转为十六进制【IDEA》Tools》Groovy Console》println Long.toHexString(1234) 即可完成转换】。
sudo jstack -l -F pid | less 获取 Java 线程堆栈,用十六进制的本地线程 ID 搜索,会在某一行的 nid 处找到对应的线程。查看 Java 线程堆栈,找到对应的 Java 类及行号,然后阅读代码查找可能的问题原因。
jstack 堆栈信息里 tid/nid 的说明 https://docs.oracle.com/javas…
The thread dump consists of the thread stack, including the thread state, for all Java threads in the virtual machine.

The header line contains the following information about the thread:
– Thread ID (tid), which is the address of a thread structure in memory.
– ID of the native thread (nid).

退出移动版