在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。这种情况发生时,我们怎么去找出原因并解决。 

一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用

1. 通过top命令找到可疑进程PID

 

op - 01:25:27 up 106 days, 10:41,  3 users,  load average: 6.65, 4.58, 4.45
Tasks: 448 total,   1 running, 447 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.7%us,  0.4%sy,  0.0%ni, 98.6%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  32862888k total, 32513500k used,   349388k free,   253228k buffers
Swap:  4095992k total,        0k used,  4095992k free, 19249260k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

24138 apache  20   0  1273m 384m 3668 S 103.319.01232:39 java
                                                               
32383 mysql     20   0 21.0g 6.6g 4752 S 10.6 21.1  75:50.50 mysqld                                                                 
10453 zabbix    20   0  230m  21m  19m S  2.0  0.1   8:47.81 zabbix_server                                                          
10455 zabbix    20   0  230m  21m  19m S  2.0  0.1   8:47.02 zabbix_server                                                          
10474 zabbix    20   0  135m  17m  15m S  1.7  0.1   5:41.90 zabbix_server                                                          
10457 zabbix    20   0  230m  21m  19m S  1.3  0.1   8:49.65 zabbix_server                                                          
10456 zabbix    20   0  230m  21m  19m S  0.7  0.1   8:53.36 zabbix_server                                                          
10460 zabbix    20   0  135m 2024 1028 S  0.3  0.0   0:11.94 zabbix_server                                                 

 

从上面命令中可以看出java进程CPU利用率一直保持100%,稳居不下,找到PID 24138

2. 找出消耗资源最高的线程

top -H -p 24138 可以不用第一步,直接执行命令 top -H ,就可以查看到消耗资源最高的线程

 

3. 查看这个线程所有系统调用

strace -24167

通过这3步基本可以找出什么原因导致java进程占用那么高CPU资源。