Linux下java进程CPU占用率高分析方法
在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。这种情况发生时,我们怎么去找出原因并解决。
一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用
1.通过top命令查看当前系统CPU使用情况,找到可疑进程PID
top –09:37:18 up 70 days,16:29,2 users, load average:1.13,1.04,0.97Tasks:105 total,1 running,104 sleeping,0 stopped,0 zombieCpu(s):1.0%us,4.9%sy,0.0%ni,93.6%id,0.0%wa,0.0%hi,0.0%si,0.5%stMem:2067816k total,1756680k used,311136k free,236340k buffersSwap:524284k total,255508k used,268776k free,277040kcached PID USER PR NI VIRT RES SHR S%CPU %MEM TIME+ COMMAND24138 apache 2001273m384m3668 S 103.319.01232:39 java3359 root 39192704360 S 0.30.04:39.34 gam_server6696 root 200341481604244 S 0.30.15:06.63 httpd19254 root 200785m221m3176 S 0.311.09:04.36 java1 root 2002224280 S 0.00.01:22.46 init2 root 200000 S 0.00.00:00.00 kthreadd3 root 200000 S 0.00.00:33.42 ksoftirqd/05 root 200000 S 0.00.00:00.03 kworker/u:0
从上面命令中可以看出java进程CPU利用率一直保持100%,稳居不下,找到PID 24138
2. 找出消耗资源最高的线程
top -H -p 24138 可以不用第一步,直接执行命令 top -H ,就可以查看到消耗资源最高的线程
top – 09:49:49 up 70 days, 16:41, 2 users, load average: 1.01, 1.04, 1.00
Tasks: 72 total, 1 running, 71 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.6%us, 1.3%sy, 0.0%ni, 97.7%id, 0.1%wa, 0.0%hi, 0.0%si, 0.2%st
Mem: 2067816k total, 1760840k used, 306976k free, 236744k buffers
Swap: 524284k total, 253344k used, 270940k free, 279092k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24167 apache 20 0 1273m 384m 3688 R 99.1 19.0 1169:43 java
24152 apache 20 0 1273m 384m 3688 S 2.0 19.0 0:28.58 java
24188 apache 20 0 1273m 384m 3688 S 2.0 19.0 4:56.69 java
24138 apache 20 0 1273m 384m 3688 S 0.0 19.0 0:00.00 java
3. 查看这个线程所有系统调用情况
strace -p 24167
可能没有重要信息
4. 将需要的线程ID转换为16进制格式
printf “%x\n” 24167
73ef
5. 最后打印线程的堆栈信息:
jstack |grep 73ef -A
6、也可抓取堆栈信息,查看代码位置
jstack -F 24167 > dump.txt
通过这几步基本可以找出什么原因导致java进程占用那么高CPU资源。